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

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
L
LINUX DO - 最新话题
Help Net Security
Help Net Security
N
News | PayPal Newsroom
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
W
WeLiveSecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
Webroot Blog
Webroot Blog
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tor Project blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
PCI Perspectives
PCI Perspectives
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
S
SegmentFault 最新的问题
J
Java Code Geeks
P
Privacy & Cybersecurity Law Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 【当耐特】
博客园_首页
H
Hacker News: Front Page
T
Threatpost
Jina AI
Jina AI
博客园 - Franky
月光博客
月光博客
L
LINUX DO - 热门话题
The Cloudflare Blog
H
Heimdal Security Blog
博客园 - 司徒正美
酷 壳 – CoolShell
酷 壳 – CoolShell
Cloudbric
Cloudbric
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
S
Secure Thoughts
T
Tenable Blog
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

陈少文的网站

巨变与机遇的未来十年 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) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
统一登录服务
微信公众号 · 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);