OAuth

全称 open authorization
相关术语
举个例子,第三方应用想访问某用户关注的公众号。
资源所有者:用户
资源服务器:腾讯服务器
授权服务器:腾讯认证中心
客户端:第三方应用
三种认证方式
1. Resource Owner Password Credentials Grant(资源所有者密码凭据许可) 用户直接微信账号和密码给第三方应用。
2.Implicit Grant(隐式许可) 用户向腾讯认证中心获取一个 token 。
用户把这个 token 传给第三方应用,这样第三方应用有权访问用户关注的公众号。
缺点:taken 放在 URL 的 # 后面,叫 hash fragment,明文传输。
优点:只会停留在浏览器端, 只有 Javascript 能访问它,并且它不会再次通过 http request 发到别的服务器。第三方应用的后端服务器不用参与。
3. Authorization Code Grant(授权码许可) 用户向腾讯认证中心获取一个授权码。
用户把这个授权码给第三方应用。
第三方把这个授权码传给腾讯认证中心,获取 token 。
这样第三方应用有权访问用户关注的公众号。
更强保障:
只有在腾讯注册的第三方应用发出的 token 请求, 腾讯认证中心才认为合法;
还可以让授权码有时间限制,比如5分钟失效;
还有可以让授权码只能换一次 token 。
授权码许可实例 我在用新浪账号登录知乎时,客户端是知乎,授权服务器是新浪。
知乎会把我重定向到这样的页面:

OAuth
文章图片
登录知乎 这个页面的 URL 是:
https://api.weibo.com/oauth2/authorize? scope=email& state=37326432303439352d313332642d343436332d616434342d323038343833643833366234& redirect_uri=http%3A%2F%2Fwww.zhihu.com%2Foauth%2Fcallback%2Fsina& response_type=code& client_id=3063806388

为了方便阅读,我把这条 URL 进行了多次回车。
第一行:oauth2 说明使用的授权机制就是 oauth2 。
第二行:scope 表示申请的权限范围,这里是邮箱。可选。
第三行:state 表示知乎的当前状态,可以指定任意值,新浪会原封不动地返回这个值。
第四行:redirect_uri 表示重定向 URI,可选项。
第五行:response_type 固定是 code ,因为是授权码许可,必填。
第六行:client_id 这里标识知乎,必填。
当点击允许后,新浪会将我导向到知乎事先指定的 redirect_uri,同时附上授权码:
https://www.zhihu.com/oauth/callback/sina? state=37326432303439352d313332642d343436332d616434342d323038343833643833366234& code=17ad14c9183a5d3fab259d1c96277638

这时知乎收到授权码后,附上 redirect_uri,向认证服务器申请令牌(token)。
这一步是在知乎后台的服务器上完成的,对用户不可见。
新浪核对了授权码和重定向 URI,确认无误后,向知乎发送访问令牌(access token)和更新令牌(refresh token)。
【OAuth】授权码有效期很短,通常设为10分钟,只能使用一次,再次会被新浪拒绝。
该码与客户端 ID 和重定向 URI,是一一对应关系。

    推荐阅读