OAuth,即 Open Authorization,是个基于网络请求工作的标准,现在广泛使用的是OAuth2(2.0)。
名词解释
这里是接下来需要使用的所有名词解释。
用户:服务使用者。
客户端(client):被使用的服务
资源所有者(后称第三方):为即将使用的登录信息的所有者,如微信、支付宝、QQ等。
授权服务器:OAuth核心,提供授权服务。
资源服务器:存储用户数据的服务器
令牌:其实这个并没有明确定义,可以是JWT(JSON WEB TOKEN)也可以是任何形式,只要你能保证安全性。这个令牌有两种,一种是访问令牌,基本是以分、秒为单位的,超时就失效,无法撤销;另一种是刷新令牌,可以是任意时间,必须通过身份验证才能刷新时效,并且可以被撤销。一般用于访问资源服务器的都是访问令牌,访问授权服务器的时候需要刷新令牌。
流程
直接通过一个例子来解释:
假设你现在想访问一个论坛,登录的时候点击了微信登录,之后论坛去请求授权获得了授权码和重定向地址(之前设置的), 你看到了一个授权界面,告诉你要授权什么权限,你点击了同意,之后论坛就把请求发给第三方,第三方验证无误后就把令牌给了你,论坛后续就可以以你的令牌和id去获取需要的注册信息了,当然这一过程你当然不会感知到,你只会感觉点完同意就登录上了。
授权模式
授权码模式
此模式是最安全、使用广泛的模式。
用户访问client,client重定向客户至授权服务器,后者将用户导向client事先指定的redirectUrl并给一个code
client收到code后加上redirectUrl向授权服务器申请令牌,形如:/auth/token?response_type=code&client_id=xxx&redirect_url=xxxxxxx
认证服务器收到请求后会核对code和redirectUrl,没问题就会发放 访问令牌 和 刷新令牌。
简化模式(Implicit)
顾名思义,简化了code的步骤,客户端被直接发了访问令牌,省去了授权码验证的过程,也就是说这一过程可能会导致暴露出访问令牌,但是也减少了网络请求的次数,所以这是需要具体权衡的,其他流程和授权码模式一致,该授权授权,该携带携带。
密码模式
就是和最开始的例子一样,通过用户名密码请求授权,不过需要注意!client会经手这些信息给第三方验证,原则上client不得存储任何信息,但是谁也说不准,一般请求到的也是短期的访问令牌。所以除非非常相信client,不然还是别了。
客户端模式
就是由client代替用户进行验证,以client自己的名义验证并得到一个访问令牌。由于过程中不存在用户这个主体,所以也不存在授权这一过程。
如果还需要知道每个操作的详细细节和代码实现可以参考下方的文档链接。
欢迎评论、纠错和讨论