Please enable Javascript to view the contents

统一登录服务

 ·  ☕ 6 分钟

平台目前包括多个子系统、多个版本,不同版本都是使用相同的运营系统。为了方便用户使用多个版本,我们需要绑定用户的QQ、微信帐号。此外,为了最大限度地防止由于某个登录系统故障而导致用户无法使用APP的情况,我们需要一个统一的帐号管理&登录服务。这个服务就是:【统一登录服务】。主要包括以下功能: 绑定用户的 QQ、微信, ,支持多种登录方式(QQ、微信), 支持运维配置协作者QQ(代理游戏的开发商员工),提供统一的登录页面 & REST API,支持 xx 域系统的接入

1. 统一登录服务设计

统一登录服务为子系统提供统一的登录票据和票据验证方式,对子系统完全屏蔽第三方登录系统的接入差异。子系统接入蓝鲸统一登录服务后,则可实现QQ登录、微信登录,而不需要关心这两种登录方式的实现细节和接入流程;更重要的是,第三方登录系统变更时,只需要在统一登录服务上做变更,而子系统完全不需要做任何改动。

在介绍具体细节之前,先看一下简化的统一登录服务的整体架构示意图:

图1:统一登录服务架构示意图

统一登录服务主要分为两部分:登录服务,账号管理服务。登录服务主要负责将第三方登录系统的登录票据转换为统一的登录票据,并维护票据信息,账号管理服务主要处理用户多个账号体系(QQ、微信)的映射关系。

统一登录服务的核心数据是登录票据,难点是如何将登录票据跨域写入子系统的cookie中。本文先重点围绕这两部分展开。

1.1 登录票据设计

第三方登录系统验证用户登录信息成功后,统一登录服务根据登录方式、用户id、登录时间戳等信息生成原始的登录票据(o_ticket);原始登录票据(o_ticket)经过AES加密、Base64编码后生成统一的登录票据(bk_ticket)。

1
2
3
4
# 原始登录票据
o_ticket = '登录方式|用户id|登录时间戳'
# 统一登录票据
bk_ticket = urlsafe_b64encode(AES(o_ticket))

1.2 跨域设计

大家都知道cookie是无法跨域写入的,蓝鲸统一登录服务是如何做到将登录票据写入不同域下的呢?详细的过程如下图所示:

图2:登录票据写入cookie

如上图所示,登录票据生成成功后,系统根据回调url判断子系统个跟域是否为 xx域,不是则重定向子系统所属的域下写入cookie。如回调url为:http://t.ob.com, 则重定向到 bklogin.ob.com,在 ob 域下写入 cookie 后再跳转到 http://t.ob.com

注:

(1)统一登录服务目前支持 xx 域、ob 域和 tencent 域。
(2)其他域下的子系统接入时,只需要申请域名:bklogin.targetdomin.com,并将其 cname 到 bklogin.xx.com 即可。

2. 用户信息管理

统一登录服务不只是集成了多种登录方式,更重要的是提供了统一的帐号管理服务。如公司内部系统的接口都是以用户的rtx名称鉴权,而第三方云平台提供的API接口(如腾讯云API)是以用户的qq号进行鉴权,这就要求用户不管是以何种方式登录,统一登录服务都能正确地拿到其在不同账号体系中的身份信息。

统一登录服务从用户系统中同步了用户的rtx名称、qq号、微信号,并将其存储在自己的用户信息表中。用户也可以在平台的个人中心中修改自己绑定的qq号和微信号。统一登录服务的用户信息表如下图所示:

图3:用户信息表

3. 系统接入

为方便系统接入,统一登录服务提供了统一的登录页面、简单登录框页面和REST API。此外,统一登录服务提供了前台js版的退出登录接口,系统可以在前台调用js方法清除统一登录的票据cookie后,再执行自己的退出登录逻辑。

3.1 API接口

统一登录服务提供了REST API,包括后台接口和前端js接口。

3.1.1 后台接口:

  • 登录首页:http://login.o.xx.com?app_code=xx&c_url=http://xx.xx.xx
  • 登录框页面:http://login.o.xx.com/plain?app_code=xx&c_url=http://xx.xx.xx
  • 验证登录接口:http://login.o.xx.com/user/is_login?bk_ticket=xxxxxxxxx
  • 用户基本信息接口:http://login.o.xx.com/user/get_info?bk_ticket=xxxxxxxxx
  • 用户详细信息接口:http://login.o.xx.com/user/get_full_info?bk_ticket=xxxxxxxxx
  • 用户权限接口:http://login.o.xx.com/user/get_user_right?bk_ticket=xxxxxxxxx

【返回参数说明】:

参数名称类型说明
返回码如果错误,返回错误信息返回数据

【返回码说明】:

ret = 0: 正确返回
ret > 0: 用户传送的参数不正确
ret < 0: 系统内部错误,请联系【蓝鲸助手】处理

【错误码说明】:

错误码(ret)含义说明
1000没有登录票据
1001登录票据不合法
1002登录票据已过期
1003用户信息不存在
-1系统内部错误,请联系【助手】

3.1.2 前端js接口:

引用js:http://login.o.xx.com/static/js/bklogout.js
退出登录方法:bk_logout.logout();

3.2 接入流程

系统接入蓝鲸统一登录服务,只需要:登录页面接入、登录态校验、退出登录三个步骤。

3.2.1 登录页面接入

统一登录服务提供了两种登录页面的接入方式:

  • 一种是完整的登录页面( http://login.o.xx.com ),如图4所示。
  • 一种是简单的登录框页面( http://login.o.xx.com/plain ),该页面只包含最简洁的登录框,系统开发者可以很方便把它嵌入到系统自己的登录首页中,也可以做成弹出框的形式(针对用户进入系统后登录态失效的情况,这种方式对用户来说更友好,只需要弹出登录框来重新获取登录态,而不需要刷新页面),如图5所示。

    图4:登录页面

    图5:登录框页面

【参数说明】:

参数名称类型说明
app_codestr接入系统id
c_urlstr登录成功后的回调链接
default_modestr默认的登录方式,可选值为:qq、xx

3.2.2 登录态校验

从cookie中获取登录票据(bk_tciket)后,可以通过以下两种方式来进行登录态校验:

  • 方式1:调用/user/get_info 接口来验证登录态。用户进入系统时建议使用该接口,该接口即可验证登录态又可以获取登录用户的信息。
  • 方式2:调用专门的登录态校验接口/user/is_login。
  • 方式3:调用判断用户权限接口/user/get_user_right。后台admin系统接入时可以调用该接口判断用户权限(is_superuser:用户为该系统的超级管理员、is_staff:用户为该系统的普通管理员)

3.2.3 退出登录:

退出登录时,请按如下步骤调用接口清除登录态,请勿随意删除统一登录服务下发的有关cookie,以免造成用户登录出现问题。

  • 引入js脚本:http://login.o.xx.com/static/js/bklogout.js
  • 调用退出登录接口:bk_logout.logout(callback);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function callback(status){
	// 回调状态参数为2表示清除登录票据成功
	if(status == 2){
	// 你的退出登录逻辑
	}else{
	// 登出失败处理逻辑
	}
}
// 清除登录票据操作,操作成功后回调callback方法
bk_logout.logout(callback);

微信公众号
作者
微信公众号