OAuth2.0从入门到出道
什么是OAuth2
OAuth2的几种不同的“角色”
资源拥有者:掘金的用户 第三方软件:掘金(有些文章叫做客户端) 授权服务:微信开放平台的授权服务 受保护的资源:微信头像、微信其他信息
OAuth2的几种类型
授权码凭据许可 资源拥有者凭据许可(账号密码类型) 客户端凭据许可 隐式许可(简单类型)
授权码凭据许可
官方流程
掘金登录流程
用户打开掘金 用户点击登录(微信登录) 界面跳转到微信扫码页面 用户扫码登录 用户授权并同意 登录成功,页面跳转回掘金
掘金登录详细流程
用户打开浏览器,打开掘金 用户点击登录 页面跳转到微信扫码页面 微信授权服务校验掘金的请求信息 用户用微信扫码 用户用微信授权并同意 微信授权服务校验用户信息 页面跳转到掘金前端页面并附带上授权码 掘金前端用授权码请求掘金后端 掘金后端调用微信的OpenApi请求访问令牌 微信授权服务校验授权码及掘金的请求信息,并响应访问令牌 掘金后端拿到访问令牌,并通过访问令牌获取用户信息(用户唯一ID、微信头像,用户名等) 掘金后端记录用户登录 掘金后端响应前端用户登录成功 掘金前端给用户展示登录成功页面
我们需要重点关注的几个步骤
第三点与第四点(跳转到微信扫码登录页)
当我们从掘金跳转到微信扫码页面的时候,我们可以观察下微信扫码页面的URL https://open.weixin.qq.com/connect/qrconnect?appid=wx1f78f78832fc2c16&redirect_uri=https%3A%2F%2Fjuejin.im%2Fpassport%2Fauth%2Flogin_success&response_type=code&scope=snsapi_login&state=0d26ae7d3gASoVCgoVPZIDU5OTlkODY2ZDg1MTA1YmJkYjhjOTY4NzI4Y2VkMzYzoU6-aHR0cHM6Ly9qdWVqaW4uaW0vb2F1dGgtcmVzdWx0oVYBoUkAoUQAoUHRCjChTdEKMKFIqWp1ZWppbi5pbaFSBKJQTNEDQaZBQ1RJT06goUyyaHR0cHM6Ly9qdWVqaW4uaW0voVTZIDJjNzMzMWI5YzdkMzk5MzljYjYyYjdiODllOTJlNDZioVcAoUYAolNBAKFVww%253D%253D#wechat_redirect
appid:appId,第三方的唯一标识 redirect_uri:授权成功后的跳转URL scope:权限范围
appId是否正确(你不能随便瞎传一个appId,否则微信怎么知道是否是合法的第三方呢?) 根据appId校验授权成功后的跳转URL是否正确(如果跳转的URL不是注册时填写的URL,是不被允许的) 根据appId校验第三方的权限范围是否正确(第三方本次授权的权限范围不能超过它申请时的范围。比如申请时只需要查询用户信息,但是本次授权却需要查询用户好友列表,这肯定是不被微信允许的)
第七点(校验用户授权信息)
当用户用微信授权并同意的时,这时用户会提交授权同意信息给微信授权服务。这时,微信授权服务主要做三个任务: 验证权限范围:第三方软件可能需要用户个人信息、用户好友列表、用户所在地等权限信息,但是作为用户为了保护自己的隐私,不一定会把全部的信息给到第三方,用户可以自由选择哪些允许授权。 生成授权码:当用户同意授权后,微信授权服务会为本次授权生成授权码。 重定向至第三方URL:微信授权服务授权码成功后,需要告知第三方软件,它要通过跳转到第三方的URL上。 第八点(授权码)
授权码是一个非常关键的信息,它用于后续与appSecret配合,获取访问令牌。关于授权码,我们要知道的是: 这里授权码生命周期设计的如此短,而且它是一次性的,主要是为了安全。因为授权码是微信通过重定向跳转到第三方URL上的,所以授权码是直接暴露在外的。 授权码是一次性的,用了一次之后,微信会把它作废,后续想要使用,必须使用新的授权码。 授权码是有时间限制的,而且这个时间是非常短的,官方推荐是10分钟以内,而大部分授权平台授权码的有效时间一般是3~5分钟。 第十点(访问令牌)
掘金想要访问到用户的资源,最终还是要通过访问令牌去请求用户的资源。授权码其实只是一个临时的通行证。获取访问令牌有三个关键参数: 微信根据上述三个参数,校验第三方是否存在,appSecret是否正确,授权码是否正确来生成访问令牌。 至于访问令牌的种类,不同的软件授权服务有不同的规则,它可以是一串UUID,也可以是JWT,我们日常使用的token都适合的。只不过大家要注意的是,OAuth2和JWT其实并没有绝对依赖的关系,不要一开始就把二者混为一谈,否则后续很容易让自己云里雾里。
当掘金拿到访问令牌后,就可以访问用户资源接口,获取用户信息了。 其实很多人不理解,为什么要弄一个授权码还弄一个访问令牌呢?直接一步到位不就好了吗? 我们仔细看看时序图,授权码是微信通过浏览器的URL重定向告诉掘金的,所以基本上没啥安全性可言,大家都能知道它; 而访问令牌则是掘金的后端服务器直接与微信授权服务通信,获取到的,因此它的安全性是比较好的。 另外,有些软件授权服务不仅仅会返回访问令牌(accessToken),还会返回一个刷新令牌(refreshToken)。刷新令牌的作用其实和授权码很相似,就是通过刷新令牌获取访问令牌,而且访问令牌也是一次性的,也有有效期,只不过它的有效期会相对比较久,有些软件的刷新令牌有效期是一周。 为什么有这个刷新令牌呢?因为访问令牌是有有效期的。假设没有刷新令牌,当访问令牌过期后,如果第三方软件还要继续获取用户资源信息,那么只有一个办法了:告诉用户访问令牌过期,让用户重新走一遍访问令牌申请流程。毫无疑问,这个用户体验是非常差的。而如果有刷新令牌,那么第三方软件可以再访问令牌过期前,在后端静默的申请一个新的访问令牌,而整个流程是用户无感知的。 大厂获取accessToken的时序图
微信授权接入文档 微信
appId:用户的唯一标识,微信授权服务需要校验第三方是否存在 appSecret:还记得上述我们说过,掘金需要去微信开放平台注册时的申请的appSecret吗?就是在这里用上了。 授权码:第八点生成的授权码
支付宝
资源拥有者凭据许可(账号密码类型)
客户端凭据许可
隐式许可(简单类型)
评论