自定义登录

最近更新时间:2020-04-27 18:10:40

Cloudbase 自定义登录的主要应用场景是支撑开发者将自有的账号体系与 Cloudbase 账号进行一对一关联。
C 端用户首先登录开发者自有的用户系统,然后开发者服务器将自有账号体系下的唯一用户 ID(称之为 customUserId)结合私钥(控制台获取)计算出 Cloudbase 的自定义登录凭证 ticket,最后使用 ticket 登录 Cloudbase 完成整体登录流程。

开通流程

前期准备工作

Cloudbase 自定义登录的前提是开发者拥有自己的账号体系和支持用户管理(登录/注册等)的服务器,在此前提之下需要安装 Cloudbase 提供的tcb-admin-node

# npm
npm install tcb-admin-node -S
# yarn
yarn add tcb-admin-node
说明:

目前自定义登录只支持 Node.js 服务器环境。

控制台获取私钥并配置域名

获取私钥文件

登录 Cloudbase 控制台,单击需配置的环境,在【环境设置】> 登录方式 下的 自定义登录 栏中,单击私钥下载
云开发下载私钥

私钥是一份 JSON 格式的数据,将下载或复制的私钥 JSON 保存到您自己的服务器中,例如路径为/path/to/your/tcb_custom_login.json

说明:

1.私钥文件是证明管理员身份的重要凭证,请务必妥善保存,避免泄漏。
2.每次生成私钥文件都会使之前生成的私钥文件在 2 小时后失效。

编写 ticket 创建模块

使用 tcb-admin-node 在自己的服务端应用内编写创建 ticket 的模块:

const tcb = require('tcb-admin-node');

// 1. 直接使用下载的私钥文件
const app = tcb.init({
  env: 'your-env-id',
  credentials: require('/path/to/your/tcb_custom_login.json')
});
// 2. 开发者自有账号体系下的唯一用户ID
const customUserId = 'your-customUserId';
// 3. 创建ticket
const ticket = app.auth().createTicket(customUserId, {
  refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
// 4. 将ticket返回客户端
return ticket;
说明:

开发者也可以编写一个云函数用于生成 ticket。

添加安全域名

Web 应用需要将域名添加到腾讯云 云开发控制台 对应环境的【环境设置】> 安全配置 下的 WEB安全域名 列表中,否则将被识别为非法来源:

客户端 SDK 使用 ticket 登录

最后使用 Cloudbase 客户端 Web SDK 提供的 auth.signInWithTicket() 登录 Cloudbase:

Web 端示例:

import tcb from 'tcb-js-sdk';

const app = tcb.init({
  env: 'your-env-id'
});

const auth = app.auth();

async function login(){
  const loginState = await auth.getLoginState();
  // 1. 建议登录前检查当前是否已经登录
  if(!loginState){
    // 2. 请求开发者自有服务接口获取ticket
    const ticket = await fetch('...');
    // 3. 登录 Cloudbase
    await auth.signInWithTicket(ticket);
  }
}

login();

Flutter 端示例:

import 'package:cloudbase_core/cloudbase_core.dart';
import 'package:cloudbase_auth/cloudbase_auth.dart';

// 初始化
CloudBaseCore core = CloudBaseCore.init({
  'env': 'xxx'
});

// 获取登录对象
CloudBaseAuth auth = CloudBaseAuth(core);

// 获取登录状态
CloudBaseAuthState authState = await auth.getAuthState();

// 唤起自定义登录
if (authState == null) {
  await auth.signInWithTicket(ticket);
}

整体流程示意如下:

常见问题

自定义登录一定需要自己架设用于创建 ticket 的服务器吗?

Cloudbase 自定义登录必须有一个创建 ticket 的服务,但是并非一定要开发者自己搭建。可以编写一个云函数来创建 ticket,然后客户端使用云接入 HTTP 请求调用这个云函数获取 ticket,详细的云接入方案请参阅使用云接入 访问云函数

目录