User

# 概览

User 是 BytePower 中核心功能之一,主要是给用户提供账户管理。目前支持匿名登录、第三方登录 、发票登录(deprecated) 等登陆方式。第三方登录包括社交平台登录:Facebook、Instagram、Google(仅 Android)、WeChat、QQ,手机验证登录(仅限中国区),苹果账号登录等多种登录方式。

account-overview

# 匿名登录

如果你正在开发轻账号体系的应用,你可能需要用到匿名登录功能。匿名登录提供了一种简便的账户注册登录方式,用户在使用你的应用时可以不提交任何的额外信息,直接在服务器端开户,获取到 User ID,并通过该 ID 接入 BytePower 的其他账户相关服务。

默认情况下,BytePower 并没有为你的应用默认开启匿名登录的功能,如果你想要开启匿名登录,在你的应用控制台 Basic -> User -> Config 中勾选 Anonymous Login 即可。

提醒

如果你使用了匿名登录,请在客户端妥善保存用户的 User ID 信息,避免因为 User ID 信息丢失而导致的用户信息丢失。

当你决定将匿名用户转换成正式用户,或希望用户能够跨平台、跨设备登陆时,你最好不要使用匿名登录功能,或者是为匿名用户绑定第三方登录信息。

# 用户名密码注册登录

BytePower 支持通过用户名、密码来注册、登录。

你的用户仅需要提供账号和密码,就可以在 BytePower 下创建账户,后续可以继续使用此账号密码来登录你的应用。

接入此功能无需申请,接口调用方式请查看接口文档 (opens new window)

注意事项

  1. 同一应用下的用户名不能重复。
  2. 注册、登录接口不是同一个,请注意区分。

# 第三方登录

BytePower 为你的用户提供了丰富的第三方登录方式,包括 Facebook、Instagram、Google(仅 Android)、WeChat、QQ 等国内外主流的社交平台,手机号验证码登录,以及 iOS 13+ 支持的 Sign in with Apple 功能。第三方登录可以帮你快速创建用户信息,减少复杂的登录流程,并和 BytePower 的其他账户体系功能集成起来。

如果你想使用第三方登录功能,需要在你的应用控制台 Basic -> User -> Config 中添加一个新的 Third-party Login Config。不同登录方式需要配置的登录信息稍有不同。

注意事项

  1. 在 BytePower 控制台配置完第三方登录之后可能不会立即生效,生效时间为 0-5 分钟。
  2. 已经保存的第三方登录配置不支持修改,如果想要修改,请删除并重新创建。
  3. 如果在开发者平台中,想要添加一个全新的 App 并使用第三方登录,请在 BytePower 控制台同步创建一个全新应用,不要更改已经存在的 App 的配置数据。
  4. 请谨慎删除第三方登录相关配置,避免你的应用发生登录故障。

# 微信登录

微信登录基于 OAuth2.0 协议标准 (opens new window),接入微信登录之后,你的用户可以直接使用微信授权登录或者通过扫描二维码登录。

接入微信登录之前,您需要准备以下资料:

  1. 企业信息,包括企业名称、企业简介、主题信息、官方网站、企业头像等。
  2. 注册人信息,包括真实姓名、手机号、联系地址、证件信息

# 成为微信开放平台开发者并创建应用

  1. 首先进入 微信开放平台 (opens new window)
  2. 点击“注册”或“登录”,进入填写资料页面,填写相应的企业和个人相关信息,等待审核通过。
  3. 审核通过之后,登录微信公众平台,进行开发者资质认证,需要准备的资料包括申请公函、工商营业执照、统一社会信用代码、法人代表人的身份信息等。如果认证为企业,需要提供组织机构代码、法定代表人、企业开会名称、企业银行账号、营业执照、公函、管理员手机号身份证号等。
  4. 认证成功之后,此微信开放平台账号下创建的应用可以获得微信登录等接口的使用权限,认证有效期为一年。支付年审费用后,等待认证通过。
  5. 创建属于你的微信开放平台的 Application,等待审核通过后,可以获取到 AppID 和 AppSecret。

# 在 BytePower Console 中配置微信登录

  1. 打开你的应用控制台中的 Basic -> User -> Config 页面,添加一个新的 Third-party Login Config,选择 WeChat
  2. 填写 AppID 和 AppSecret 到这里。

# Facebook 登录

# 申请成为 Facebook 开发者并创建应用

  1. 进入 Facebook 开发者平台 (opens new window),注册成为开发者。
  2. 登录成功之后,点击页面中右上角我的应用,创建你的应用。
  3. 进入你的应用控制台,在首页找到 Facebook 登录的功能,点击设置进入快速启动页面。
  4. 选择你要接入的平台,按照页面中的流程依次进行相应的配置。

# 在 BytePower Console 中配置 Facebook 登录

  1. 打开 Facebook 开发者平台,进入你的应用首页,点击左侧菜单栏:设置 -> 基本,找到应用编号和应用秘钥。
  2. 打开 BytePower 控制台的 Basic -> User -> Config 页面,添加一个新的 Third-party Login Config,选择 Facebook
  3. BytePower 控制台中的 App id 对应 Facebook 开发者平台中的应用编号,App secret 对应应用秘钥,依次填写。

# Instagram 登录

Instagram 登录基于 OAuth2.0 协议标准 (opens new window),接入 Instagram 登录之后,你的用户可以使用 Instagram 进行授权登录。

Instagram 登录属于 Facebook 开发者平台中的一个功能,不用申请单独的开发者账号。

# 申请成为 Instagram 开发者并创建应用

  1. 进入 Facebook 开发者平台 (opens new window),注册成为开发者。
  2. 登录成功之后,点击页面中右上角我的应用,如果你还没有应用,可以点击创建一个新的应用,也可以使用现有应用。
  3. 进入应用详情页面,找到页面左侧菜单栏产品,点击+,显示添加产品页面。然后找到 Instagram 卡片的“设置”按钮,点击进入设置页面,然后点击左侧菜单栏:Instagram -> Basic Display,拉到页面底部,点击 Create New App 创建一个 Instagram 应用。
  4. 创建成功之后,你可以在当前页面获取到你的应用的应用编号应用秘钥
  5. 如果已经创建了应用并打开 Instagram 登录的功能,那么点击左侧菜单栏:Instagram -> Basic Display,即可获取到应用编号应用秘钥

# 在 BytePower Console 中配置 Instagram 登录

  1. 打开 BytePower 控制台的 Basic -> User -> Config 页面,添加一个新的 Third-party Login Config,选择 Instagram
  2. BytePower 控制台中的 App id 对应 Facebook 开发者平台中的 Instagram 应用编号,App secret 对应 Instagram 应用秘钥,依次填写。

# Google 登录

# 申请成为 Google 开发者并创建应用

  1. 进入 Google 开发者平台 (opens new window),注册成为开发者
  2. 进入 API Console (opens new window) ,创建一个项目

# 为应用创建 Client ID

  1. 访问 (opens new window)Google 登录指引 (opens new window) ,点击页面中的 Configure a project
  2. 选择项目后,选择对应的应用类型,填入 package nameSHA-1 签名后即会自动创建 Client ID

# 在 BytePower Console 中配置 Google 登录

  1. 访问 API Console (opens new window) ,进入 credentials 页面,复制 Web client (Auto-created for Google Sign-in) 中的 Client ID
  2. 打开 BytePower 控制台的 Basic -> User -> Config 页面,添加一个新的  Third-party Login Config,选择  Google
  3. 把你要接入 Google 登录的应用的  Client ID 填写到  APP ID

# QQ 登录

# 申请成为 QQ 互联开发者并创建应用

  1. 进入 QQ 互联官网 (opens new window),注册成为开发者,提交身份信息,等待审核通过。
  2. 你的开发者账户审核通过之后,创建你的应用,提交应用相关信息,等待审核通过。
  3. 你的应用审核通过之后,可以在应用详情页面查看到你的应用的 App ID 和 App Key。

# 在 BytePower Console 中配置 QQ 登录

  1. 打开 BytePower 控制台的 Basic -> User -> Config 页面,添加一个新的 Third-party Login Config,选择 QQ
  2. 把你在 QQ 互联平台中创建的应用的 App ID 和 App Key 分别填写在这里。

# 苹果账号登录

# 苹果开发者账号申请并创建应用

  1. 进入 苹果开发者官网 (opens new window),登录苹果账号,点击右上方 Account 进入开发者账号主页面。
  2. 点击 Join the Apple Developer Program,进入申请开发者账号的流程,然后点击页面右上方的 enroll 按钮,开始申请。
  3. 申请完成之后,回到开发者账号主页面,点击 Certificates, Identifiers & Profiles 按钮,进入配置页面。
  4. 点击 Identifiers,可以看到自己创建的应用列表,如果目前没有创建应用,请点击+新建一个。

# 为应用配置苹果账号登录

  1. 已创建的应用:点击左边栏 Identifiers 列表中你要接入苹果账号登录的应用,进入应用详情,选择 Sign In with Apple 选项。
  2. 新创建的应用:点击 Identifiers 列表上方的+,新建一个应用,新建过程中,在 Capabilities 的选项里勾选 Sign In with Apple

# 为应用开启苹果账号登录功能

  1. 已创建的应用:点击左边栏 Profiles,选择右侧列表里你要接入苹果账号登录的应用,点击进入 Generate a Provisioning Profile 页面,在这个页面中重新生成一个新的 Profile 并下载。
  2. 新创建的应用:点击 Profiles 标题旁的+,新建一条数据,进入 Register a New Provisioning Profile 页面,按照页面中的流程,为刚刚创建的应用新建一个 Profile,并下载。
  3. 点击左边栏 Keys,然后点击页面中的 Create a key,按照页面提示步骤依次填写相关内容,创建一个秘钥。
  4. 创建完成之后,页面中显示了 Key ID/Team ID 等参数和下载 key 文件的选项,注意这个 key 文件只能下载一次,下载后请妥善保存。

# 在 BytePower Console 中配置苹果账号登录

  1. 打开 BytePower 控制台的 Basic -> User -> Config 页面,添加一个新的 Third-party Login Config,选择 Apple
  2. 把你要接入苹果账号登录的应用的 Key ID/Team ID 等参数填写到这里。

# 手机号验证登录

BytePower 提供了手机号登录的功能,你的用户可以通过手机号登录 BytePower 的账户系统(如果第一次登录则自动创建新账号),目前仅支持中国区的应用。

# 接入申请

  1. 打开你的应用控制台中的 Basic -> User -> Config 页面,在 Sign in With Phone 的列表中新增一个短信签名,添加完之后,请通知 BytePower 组的同事。
  2. 签名内容要求 2~12 个字,由中英文或数字组成,中文和英文都作为一个字统计,支持全英文,不支持空格、符号或全数字。
  3. 提交之后,等待审核通过,审核时间为 1-3 个工作日。
  4. 不同状态的签名最多可以同时存在 5 个,把你要使用的设置为 Activated 状态。

注意事项

  1. 每个手机号在 1 天之内最多申请 10 次验证码,在 1 小时之内最多申请 5 次,申请时间间隔最小为 50 秒。
  2. 验证码的有效时间为 10 分钟。
  3. 用户连续申请多个验证码,只有最后申请的有效。
  4. 如果用户在 BytePower 系统已经有账号,可以使用此功能绑定手机号,每个用户最多绑定一个。
  5. 通过 BytePower 短信验证,还可以实现更改绑定手机号、短信验证、解绑手机号等功能,详情见 API 文档 (opens new window)

# 获取账号信息

BytePower 提供了获取用户账号信息的功能。你的应用接入 BytePower User 模块之后,可以通过此功能来获取用户账号信息,包括:用户的 uid、用户的 name、用户的第三方平台账号信息、用户绑定的手机号等。

# 账号的绑定和解绑

通过 BytePower 提供的此项功能,你的用户可以自主选择绑定或解绑第三方平台账号。

在使用此项功能之前,需要在你的应用控制台 Basic -> User -> Config 中添加相应的 Third-party Login Config。

# 账号的绑定

BytePower 允许每个用户绑定多个第三方平台的账号,但是对于同一平台只可以绑定一个。

你的用户登录成功之后,可以继续绑定未绑定过的第三方平台。绑定成功之后,可以使用绑定的平台进行第三方登录。

# 账号的解绑

BytePower 提供了对已绑定的第三方平台解绑的功能,你的用户解绑之后,可以重新绑定;也可以绑定同一第三方平台下另一个全新的账号。

# 退出登录

使用 BytePower 退出登录的功能可以让用户失去登录状态,即在服务器端删除用户的 session。

# 接入示例

# API 文档

查看 API 文档请点击这里 (opens new window)

# JWT 生成方法

:::: tabs type:border-card ::: tab Python

import time
import jwt
# 这里的 key_id 和 key_secret 请在 BytePower 控制台 -> Basic Information -> API Keys 获取。
def generate_jwt_token(key_id, key_secret, algorithm="HS256"):
    current_time = int(time.time() * 1000)
    payload = {
        "iat": current_time,
        "key_name": key_id
    }
    token = jwt.encode(payload, key_secret, algorithm="HS256")
    return token.decode("utf-8")

::: ::: tab JavaScript

let CryptoJS = require('crypto-js');

// 这里的 key_id 和 key_secret 请在 BytePower 控制台 -> Basic Information -> API Keys 获取。
let current_time = Date.now();

function base64url(source) {
  encodedSource = CryptoJS.enc.Base64.stringify(source);
  encodedSource = encodedSource.replace(/=+$/, '');
  encodedSource = encodedSource.replace(/\+/g, '-');
  encodedSource = encodedSource.replace(/\//g, '_');
  return encodedSource;
}
let header = {
  alg: 'HS256',
  typ: 'JWT'
};
let payload = {iat: current_time, key_name: key_id};

function generateJWTToken() {
  let encodedHeader = base64url(CryptoJS.enc.Utf8.parse(JSON.stringify(header)));
  let encodedData = base64url(CryptoJS.enc.Utf8.parse(JSON.stringify(payload)));
  let token = encodedHeader + '.' + encodedData;
  let signature = CryptoJS.HmacSHA256(token, key_secret);
  let signedToken = token + '.' + CryptoJS.enc.Base64.stringify(signature);
}

::: ::::

# 匿名登录

:::: tabs type:border-card ::: tab Android(Java)

user.loginAnonymousWithLocalId(new BytePowerCallback<User, AccountException>() {
    @Override
    public void onSuccess(User user) {
        // 登录成功的操作
    }
    @Override
    public void onError(AccountException e) {
        // 登录出错的操作
    }
});

::: ::: tab IOS(Objective-C)

[BPUser.currentUser success:^(BPUser * _Nullable user) {
    // 登陆成功的操作
} failure:^(NSError * _Nullable error) {
    // 登录出错的操作
}];

::: ::: tab Server(Python)

# pip3 install bytepower_client
bytepower_client.login_with_anonymity()

::: ::::

按照以上方式进行匿名登录,返回如下数据则为匿名登录成功

{
  "user": {
    "uid": "12345",
    "name": null,
    "social_accounts": [],
    "phone": {}
  }
}

# 第三方登录

# Facebook 登录

:::: tabs type:border-card ::: tab Android(Java)

AccountServerManager.getInstance().loginWithFacebook(composeFacebookLoginRequestParam(loginResult), new HttpCallback<LoginResponse>() {
    @Override
    public void onResponse(LoginResponse result) {
        // 登录成功的操作
    }
    @Override
    public void onFailure(BaseException throwable) {
        // 登录失败的操作
    }
});

::: ::: tab IOS(Objective-C)

BPFacebookAuthOperator *authOperator = [BPFacebookAuthOperator.alloc initWithPublishPermissions:@[@"email",] fromViewController:self];
[BPUser.currentUser loginWithAuthOperator:authOperator success:^(BPUser * _Nullable user) {
    // 登录成功的操作
} failure:^(NSError * _Nullable error) {
    // 登录失败的操作
}];

::: ::::

# QQ 登录

QQ 登录目前仅支持 server to server 接口调用的方法登录,请查看 API 文档 (opens new window)

# 苹果账号登录

:::: tabs type:border-card ::: tab IOS(Objective-C)

ASAuthorizationAppleIDProvider *appleIDProvider = [ASAuthorizationAppleIDProvider new];
ASAuthorizationAppleIDRequest *request = appleIDProvider.createRequest;
[request setRequestedScopes:@[ASAuthorizationScopeFullName,ASAuthorizationScopeEmail]];

ASAuthorizationController *appleSignController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
appleSignController.delegate = self;
appleSignController.presentationContextProvider = self;
[appleSignController performRequests];

::: ::::

# 手机号验证登录

手机号验证登录目前仅支持 server to server 接口调用的方法登录,请查看 API 文档 (opens new window)

# 获取账号信息

:::: tabs type:border-card ::: tab Android(Java)

user.fetchUserInfo(new BytePowerCallback<User, AccountException>() {
    @Override
    public void onSuccess(User user) {
        // 获取成功的操作
    }
    @Override
    public void onError(AccountException e) {
        // 获取失败的操作
    }
});

::: ::: tab IOS(Objective-C)

[BPUser.currentUser fetchUser:^(BPUser * _Nullable user) {
    // 获取成功的操作
} failure:^(NSError * _Nullable error) {
    // 获取失败的操作
}];

::: ::: tab Server(Python)

# pip3 install bytepower_client
bytepower_client.get_user_info(user_id = '12345')

::: ::::

获取到的账号信息示例:

{
  "user": {
    "uid": "12345",
    "name": "tom",
    "social_accounts": [
      // 如果绑定了第三方平台,这里有第三方平台相关信息
    ]
  }
}

# 账号的绑定和解绑

目前客户端仅支持 Facebook 的绑定和解绑,其他第三方平台请参照 API 文档 (opens new window)

# 绑定 Facebook

:::: tabs type:border-card ::: tab Android(Java)

// 目前 Android 客户端仅支持 Facebook 的绑定
user.bindFacebookSocialAccount(operator, new BytePowerCallback<FacebookAccount, AccountException>() {
    @Override
    public void onSuccess(FacebookAccount facebookAccount) {
        // 绑定成功的操作
    }
    @Override
    public void onError(AccountException e) {
        // 绑定失败的操作
    }
});

::: ::: tab IOS(Objective-C)

// 目前 IOS 客户端仅支持 Facebook 的绑定
BPFacebookAuthOperator *authOperator = [BPFacebookAuthOperator.alloc initWithPublishPermissions:@[@"email",] fromViewController:self];
[BPUser.currentUser bindWithAuthOperator:authOperator success:^(BPUser * _Nullable user) {
    // 绑定成功的操作
} failure:^(NSError * _Nullable error) {
    // 绑定失败的操作
}];

::: ::::

# 解绑 Facebook

:::: tabs type:border-card ::: tab Android(Java)

// 目前 Android 客户端仅支持 Facebook 的解绑
user.unbindFacebookAccount(facebookPlatforms.get(0), new BytePowerCallbackWithoutParamSuccess<AccountException>() {
    @Override
    public void onSuccess() {
        // 解绑成功的操作
    }
    @Override
    public void onError(AccountException e) {
        // 解绑失败的操作
    }
});

::: ::: tab IOS(Objective-C)

// 目前 IOS 客户端仅支持 Facebook 的解绑
[BPUser.currentUser unbindWithSocialAccount:socialAccount success:^(BPUser * _Nullable user) {
    // 解绑成功的操作
} failure:^(NSError * _Nullable error) {
    // 解绑失败的操作
}];

::: ::::

# 退出登录

:::: tabs type:border-card ::: tab Android(Java)

ser.logout(new BytePowerCallbackOnFinish() {
    @Override
    public void onFinish() {
        // 退出登录成功的操作
    }
});

::: ::: tab IOS(Objective-C)

[BPUser.currentUser logout:^{
    // 退出登录成功的操作
}];

::: ::::

上次更新: 2023-11-22 11:07:45