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吗?就是在这里用上了。 
- 授权码:第八点生成的授权码 

- 支付宝

资源拥有者凭据许可(账号密码类型)
客户端凭据许可
隐式许可(简单类型)

评论
