OAUTH的定义
引自百度百科的定义:
OAUTH合同为用户资源的授权提供了一个安全的、开放而又简易的标准。与往年的授权形式不同之处是OAUTH的授权不会使第三方触碰到用户的账号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的缩写。
目前,最新的OAUTH合同使用2.0版本,具体内容被记录在RFC6749标准中,可参考链接:。
OAUTH的应用
一个简单而不陌生的反例。
我们平常访问某个网站或峰会,如果进行一些个人操作,网页通常会弹出让我们先登入的提示。如果这时候我没有帐号又不想注册的话,该如何办呢?我们一般会点击一个第三方的小图标(比如陌陌)而完成登陆。有些网站甚至没有用户注册的功能,完全借助第三方网站登陆获取用户信息。
比如我们使用微博账号来登入segmentfault网站。
网页会首先被重定向到微博的登陆界面进行登陆,我们输入我们的帐号和密码后,segementfault网站会按照从微博账号获取的信息(比如你的微博头像、昵称、好友列表等)来创建一个用户。当然,segmentfault是不会晓得你的微博密码的,因为我们必须保证用户登入信息的安全性而不能将密码明文出去。这一系列的安全性的授权操作都缘于使用了OAUTH合同。
其实在这一过程中,OAUTH合同解决了传统第三方登陆方式的一些隐忧,比如:
也正是机遇这种,OAUTH就应运而生了。那么,上述的第三方授权登陆过程究竟是如何实现的呢?这一过程如何进行的呢?我们带着这种问题继续往下看。
OAUTH实现的思路
通过前面应用的介绍,我们不难发觉这其中可大约分为三个对象,分别是:
清楚这个以后,我们瞧瞧OAUTH授权的大约思路。
这只是一个大体的思路,说白了就是通过一个授权层隔离了客户端与用户信息,并在授权层基础上使用了一把安全的锁匙来取代用户完成授权。
OAUTH的运行流程
基于这个思路,RFC6749标准规定了四种不同的授权流程供选择,分别是:
上面提及的微博使用OAUTH2.0授权码模式完成授权。其它客户端进行第三方登陆之前,需要先在微博开放平台上注册一个应用,在应用里填写自己的信息。注册完后,开放平台会给客户端(比如前面提及的segmentfault)颁发一个client_id和一个APP Secret,供授权恳求的使用。
下面将详尽介绍微博的授权流程,即授权码模式,其它模式可以参考官方文档:。
OAUTH的详尽实现过程
下面是OAUTH2.0合同的详尽流程图:
博主以前面segmentfault通过微博第三方登陆为例来详尽说明OAUTH授权流程。
第一步
首先用户点击微博图标进行第三方登陆,然后页面跳转到微博登陆界面等待用户输入帐号密码授权。
登录界面url如下:
https://api.weibo.com/oauth2/authorize?client_id=1742025894&redirect_uri=https%3A%2F%2Fsegmentfault.com%2Fuser%2Foauth%2Fweibo&scope=follow_app_official_microblog
客服端通过application/x-www-form-urlencoded格式并使用 UTF8编码 将下述参数加入到 query string 中来构建URI恳求。
第二步
页面跳转到上一步骤的redirect_uri地址并在末尾添加一个授权码code值,在前面步骤中会用code值来换取token。
跳转地址如下:
https://segmentfault.com/user/oauth/weibo?code=e7ec7daeb7bbf8cb9d622152cd449ae0
参数说明:
这也验证了reponse_type是code类型的正确性。
第三步
segmentfault客户端使用授权的code来获得锁匙token。
获取token可以通过对微博OAuth2的access_token插口进行POST恳求完成,请求链接:
当然,请求还须要携带以下参数才行。
第四步
返回上步恳求获得的token信息。一个实例结果如下:
{
"access_token": "ACCESS_TOKEN",
"expires_in": 1234,
"remind_in":"798114",
"uid":"12341234"
}
参数说明:
第五步
使用上一步获得的token获取用户的名称头像等信息。可以通过恳求如下链接:
同时恳请须要携带以上获取的token和 uid参数。
第六步
返回获取的用户名称头像等已授权信息。