栏目:其他
1463
唐小碎发布于:2021-12-12 14:31:00
标签:
PHP
## Oauth2.0是什么
Oauth2.0是目前最流行的授权机制,用来授权第三方应用获取数据。我们现在最常用的就是在一些网站,如:哔哩哔哩,知乎,慕课网等,都支持使用微信登录。这样做有什么好处呢?就是我们用户可以不用记各种各样的密码了,只要用扫一扫就可以登录到我们想要登录到网站了,十分便捷。微信授权登录也是一种基于Oauth2.0的授权登录系统。
可以参考一下阮一峰大佬的博文:[OAuth 2.0 的一个简单解释](https://www.ruanyifeng.com/blog/2019/04/oauth_design.html)
所以Oauth2.0是一个授权协议。我们按照这个协议的步骤就能获得第三方网站的 `令牌(token)`,我们拿到令牌之后,就可以得到去第三方网站获取用户信息(唯一ID,昵称,头像)了,我们根据得到的唯一ID去查找到用户之前绑定的本站用户账号,就能实现登录功能。
OAuth 2.0 规定了四种获得令牌的流程。分别是:
- 授权码(authorization-code)
- 隐藏式(implicit)
- 密码式(password):
- 客户端凭证(client credentials)
本文只讨论:授权码 授权方式,该方式是最常用,安全性最高的方式。
## Oauth2.0步骤
详细步骤阮一峰大佬的博文:[OAuth 2.0 的四种方式](https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html) 已经描述得非常清楚了,大家可以去看看。具体的流程如下图:
[](http://static.tscgo.cn/FrP3pfp3_kUHQ-JzFye6HTDode3F )
主要步骤是:
1. 请求授权码
2. 返回授权码
3. 请求令牌
4. 返回令牌
## 微信授权登录
官方文档也写得很清楚了,[官方文档](https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html)
获取access_token时序图:这里的access_token就是我们Oauth2.0描述的`令牌` 。
[](http://static.tscgo.cn/Fn_vnp_Hrmu1Ez1w1bQHD8KF2UXQ )
## 一些疑问
##### 1,Oauth2.0授权码方式为什么中间先返回授权码(code),而不是直接返回令牌(token)呢?
1,直接返回令牌,令牌会返回到浏览器上(客户端),这样容易让黑客截获。
2,先返回授权码,授权码让后端拿到,然后后端用自己的app_secret+授权码去获取令牌,这个交互是不经过客户端的,全程是服务端和第三方授权服务交互。
3,授权码一般只能兑换一次令牌就失效,所以,授权码被截获了,还要知道app_srcret,然后还要保证是第一次兑换令牌,才能破解,增加了安全性
4,令牌是比较重要的一个通行证,如果直接只通过第一次仅用app_id就能得到令牌,是不安全的,且如果第一次请求的参数是明文的,如果此时,就把app_secret放在明文上面,也是不安全的。所以要返回一次授权码,在后端使用授权码+app_secret去获取令牌,而后端的这个交互,对用户(浏览器)来说是无感的,也非常安全。
参考文章:
1,[Oauth2的授权码模式为什么要用code获取token?](https://www.zhihu.com/question/275041157)
## 个人总结
从本质上看,网站登录就是为了找到user_id ,然后把user_id放在session或者与token关联上,这样就登录了。
先看本站自己的登录逻辑:通过用户输入的账号,密码,在数据库查找该用户,找到了,校验密码,然后把这个用户的信息放在session上,或者放在redis上使用一个key为随机字符串(token),value为user对象信息的键值对保存着。这样就登录成功了。
而第三发授权登录,就是通过用户之前在登录态,绑定了第三方(比如说微信)的授权登录,绑定的时候,第三方会为这个用户颁发一个对于我们网站唯一的 唯一ID,我们把这个唯一ID与我们user表里面的user_id对应起来,这样就是绑定成功了。
绑定成功后,用户使用第三方授权登录,我们通过Oauth2.0得到令牌,然后我们可以用令牌得到该用户的:`唯一ID`,继而就能找到我们的user_id了,从而实现了登录。
如果是未注册的用户,该用户在我们自己的user表里面并没有记录,这个用户通过第三方授权登录,得到一个token,唯一ID,我们此时一般会引导该用户去进行注册,注册成功后得到我们自己系统的user_id,然后再将这个user_id与我们获得的唯一ID绑定,这样,整个流程就完成了,下次这个用户就可以直接使用第三方授权登录了。
评论
匿名 2021-12-13 12:12:53
强!!