App之OAuth授权登录、access token、refresh token

OAuth授权是什么?   

先说一下常见的应用场景来理解吧,

情景1:我们访问一个购物应用/网站,把商品加入购物车进行结算时,会被要求先注册才能使用。但我不想在注册页面填那么多东西又想购买怎么办?那就涉及到授权登录了。我在WX里面允许这个App读取我的基本信息,让它为我自动创建一个账号,这样就可以继续购物流程了。在这授权过程中,实际是WX向App提供了一个令牌(AccessToken),App利用这个令牌去访问WX接口,得到用户的资料信息后,调用App后台接口创建了一个账号,省去了用户输入的过程。

情景2:每次登录App时,都需要输入账号、密码,使用OAuth授权机制后,在本地缓存了令牌,后续接口均使用这个它去访问。

对于情景1,第三方开发文档有很详细的说明,这里着重说一下情景2,如何仿照OAuth机制,管理本地的AccessToken。

 

登录接口应该怎么做?

我以前的一个项目,登录流程是这样的:

  • 登录页输入账号、密码
  • 后台校验账号密码,通过后(在后台服务器内部)又再次调用查询个人账户信息接口(可能有多个,如查询个人基本信息接口、账户余额接口、是否为高级会员接口 等等)
  • 把所有查询结果归集,返回登录结果
  • 前端开发人员处理结果

这种情况下,后台已经帮前端处理好要调用的接口,减轻了前端开发工作量,但也带来了接口耦合,只适用于单次登录登出的情况。如果需要免密登录,应该如何改进呢?答案就是改进登录接口。


当用户在页面输入账号、密码调用登录接口后,接口返回以下主要内容:accessToken(授权令牌)、refreshToken(刷新令牌)、expireDate(acessToken的失效日期)。

1)access_token是调用授权关系接口的调用凭证
2)由于access_token有效期较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

    a)若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
    b)若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

3)refresh_token拥有较长的有效期(30天)。当refresh_token失效的后,需要用户重新授权,所以,请开发者在refresh_token即将过期时(如第29天时),进行定时的自动刷新并保存好它。 // 摘自微信开发文档,注意这句话。

     a)refresh_token 的有效期,是文档告诉我们的一个数字,并没有相关接口可以检测refresh_token是否过期;
     b)当refresh_token失效的后,需要用户重新授权,即让用户重新输入账号密码登录;
     c)App本地在登录成功后,缓存refresh_token的同时,也要缓存时间戳。每次登录前,都先判断:
            当前时间 - 缓存的时间戳 是否大于 30天,以确定是否重新登录
     d)即将过期时(如第29天时),调用refresh_token进行定时的自动刷新,并保存好新的access_token。

 

因此正确的登录流程应该是:
1、判断是否有refresh_token 的时间缓存,若无,说明是全新登录,执行登录流程;
       若有,则判断refresh_token 是否过期
           if 当前时间 - 缓存时间戳 >= 30,说明refresh_token 已过期,重新登录,
           若refresh_token 没有过期,走判断access_token是否过期流程。
2、读取expire_date,判断access_token是否过期
           if 当前时间 - expire_date > 2小时,说明已经过期,需要去获取新的access_token 和 失效期,把结果缓存到本地。
           若access_token 没有过期,走调用接口流程
3、利用有效的access_token,进行接口请求,获取不同业务场景数据。

 

 

注意: 

1、refresh_token也有过期时间,如百度云平台会提供有效期为1个月的Access Token和有效期为10年的Refresh Token
2、当refresh_token过期的时候,则需要用户重新登录。 
3、token 值不是固定的,每次登录后都会变化,会返回一组全新的token,旧的access_token与refresh_token 也会失效。
4、不同开发平台对refresh_token管理不一样,如:豆瓣网、百度云提供的授权机制中,refresh_token 仅能使用一次,用完即失   效,因此当用 refresh token 更新 access token 后,会返回一个新的 refresh token。

 

下面是其他平台的一些说明,以供参考
百度云说明文档:

小米相关文档微信相关文档

 

数据保存

  • access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
  • refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。

 

其他问题:

问:当客户端超时了,为什么选择通过刷新token的方式,而不是提示用户重新登录?
答:重新登录需要输入密码,用户体验不好。


问:本地缓存密码和用户名,自动登录不就行了么?为什么要采用token的方式
答:客户端缓存用户名和密码,容易受到黑客攻击,如果使用了token机制,就算黑客盗取了用户的access_token与refresh_token,只需重新登录,就可令原来的token失效,不要修改登录密码。

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值