客户端 token 设计

2018-03-14 架构

简述客户端身份验证问题,基于 token 机制;

session 验证

简单系统一般是用户在登录后系统生成一个 sessionid 信息记录在服务器内存,并返回给客户端的 cookie 中,后续的业务中客户端在访问系统时都会附加上此cookie, 后台即可根据此 sessionid 判定用户身份;用户退出系统时系统在内存中清除此 session 即可。

显然此种方式适合一些比较小的业务系统,一旦用户量增加之后,对服务器内存会形成压力,若采用 session 共享方式也会增加复杂度;

token 验证

简单 token 验证

相对于上面的验证机制,此方法引入了 token 作为客户端身份验证,流程如下:

  • 用户登录系统,系统产生一个 token 缓存在 redis 等缓存工具中,并返回此 token 给客户端
  • 用户将 token 保存在本地,在之后的业务流程中向后台发起请求时都附加上此 token 值
  • 后台在收到客户端请求时验证 token,若无 token 或者 token 已过期则要求用户重新登录;若 token 已存在的且仍有效,则更新此 token 有效期并继续后续业务;

此方式对于系统的扩展性有较大的帮助,但是此种方式的安全性较差;

access_token + refresh_token 验证

https://tools.ietf.org/html/rfc6749#page-47

参考百度云 OAuth 机制如下:

客户端从后台获取 Access Token 后会拿到一个有效期为个月的 Access Token 和有效期为 10 年的 Refresh Token 对于这些应用,只要用户在 10 年内登陆应用,应用就可以使用 Refresh Token 刷新以获得新的 Access Token(新的 Refresh Token 也会同时下发),从而达到只要用户不连续 10 年未登陆过你的应用就不需要重新登陆的目的。

返回给第三方一个月有效期的Access Token + 十年有效期的Refresh Token。

Refresh Token的作用就是在Token有效期截止前,刷新以获取新的Access Token。

token 加密

由于 token 是后台生成,故而使用对称加密即可;可掺杂上用户 id 等相关量参与计算;

OAuth

参考阿里云文档:

基于OAuth2的单点登录。OAuth是一个开放授权标准,目前的版本是2.0版。OAuth允许用户让第三方应用(比如客户的自有系统)访问该用户在某一网站上(比如阿里云呼叫中心)存储的私密的资源,而无需将用户名和密码提供给第三方应用。OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站在特定的时段内访问特定的资源。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

由于access_token默认有效时间为一小时,所以每隔一小时需要点击从而刷新令牌,就是使用refresh_token换取了一个新的access_token.

关于阿里云三年内免登陆策略:由于access_token默认有效时间为一小时,refreshToken有效期为三年,所以需要先获取refreshToken,然后将其保存,以后每次就可以不用去阿里云认证就可以用refreshToken换取AccessToken

参考网友评论:

你作为第三方,写一个应用,要得到访问用户在某些大站的一些资源的授权,用户那里会弹出来大站的授权页面,这要求用户输入帐号密码做验证的。然后你拿到 access token 和 refresh token 以后,快过期了用 refresh token 刷一下,就省去让用户再输入帐号密码登录然后授权你的这一步了。

参考文章:

image

Search

    Post Directory