前言:
最近看了编程不良人的Oauth 2.0 视频,想来记录一下,以供后续的学习。
基本定义
OAuth 2.0是一种授权协议,允许用户授权从一个应用程序到另一个应用程序访问数据和api(资源)。尽管OAuth 2.0不是身份验证协议,但通常情况下,用户必须由提供访问权限的应用程序进行身份验证,然后才能授权对资源进行访问。简而言之,使用OAuth 2.0协议,用户试图登录的网站(也称为服务提供者)可以向身份提供者(即SSO服务器)请求用户的授权。身份提供者可以根据需要对用户进行身份验证,甚至可以提示用户授权对服务提供者的访问。然后,服务提供者接收一个访问令牌,该令牌可用于调用api或访问用户的数据或身份信息,以便用户可以登录到网站并执行网站中所需的操作。
基本流程:
这里简略的解释一下,后面在授权码模式会详细的解释
Client:第三方网站
Resource Owner: 用户
Authorization Server: 授权服务器
Resource Server: 资源服务
这里先举个真实的案例,来说明下Oauth 2.0 的应用场景
打开手机游戏模拟帝国,点击【账号登录】,你会发现弹出三个图标。意思就是让我们使用社交账号登录,点击QQ,会跳出下面这个界面,问我是否同意,我同意。
这样我们就可以成功的进入游戏界面了。
实际上这个游戏的登录就是使用了Oauth2.0登录 , 而非传统的账号密码登录。
Oauth 2.0 登录非常的简单,总结下来就是3步,
1. 第三方网站或者应用【模拟帝国游戏App】问用户是不是同意授权使用qq账号登录模拟帝国
2.用户同意后,模拟帝国向授权服务器发送请求,授权服务器核对没问题后,给一个Token 给第三方应用
3.第三方应用拿着Token 访问资源服务器
授权码模式:
前面一个案例只是简单的介绍了Oauth 2.0 的大体流程,实际运用中基于以上的流程衍生出四种模式,分别是授权码模式,简化模式,密码模式,客户端模式。
这里着重介绍一下最为常用且复杂的授权码模式。
以上这张图片是授权模式的流程图,
为了直观,生动的展示流程,我用Ruby China 的案例来辅助说明授权码模式的详细流程。
这是Ruby China 官方网站的登录界面,我们可以看到这里支持Github 和 Twitter 授权登录,结合流程图,跟着我的思路走,我们现在正处于左下角Client 位置,点击Github图标按钮
我们执行了A ,我们的用户代理,就是浏览器向授权服务器发送请求。请注意上面的URL,
github.com 是域名
login/oauth/authroize 是接口
?后面都是参数,这非常重要!!!
client_id 就是当初Ruby China 在Github 那里备案注册时,Github 给Ruby China 的一串编号,相当于我们的身份证号
redirect_uri 是重定向地址
response_type 是授权模式,code 就代表授权码模式
scope: 可以访问资源的范围
state: 用处就是防范CSRF 攻击
我们此时可以看到这里有提示用户是否运行授权登录,我们点击了绿色按钮,这时等价于执行B
此时我们可以看到页面开始跳转,这时候C就执行了,因为前面请求的时候提供了URL ,所以时候授权服务器就知道跳转到哪儿了。此时授权码会发送给浏览器,浏览器会发送授权码给Ruby后端服务器 ,当然用户看不到授权码,授权码是有有效期的。后面的流程不通过浏览器执行了,对于用户来说,是不可见的。接下来执行D,Ruby china拿着授权码和重定向地址到授权服务器那里,授权服务器要验证一些信息,比如授权码正不正确,Client_id 是否存在等等,验证无误后,执行E颁发Token 给Ruby China, 后面Ruby China ,就可以拿着Token 去资源服务器那里取到资源了