惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
D
Docker
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
V
V2EX
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
腾讯CDC
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
H
Help Net Security
博客园 - Franky
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
统一登录服务
微信公众号 · 2017-04-04 · via 陈少文的网站

平台目前包括多个子系统、多个版本,不同版本都是使用相同的运营系统。为了方便用户使用多个版本,我们需要绑定用户的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 登录页面接入

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

【参数说明】:

参数名称类型说明
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);