OAuth是一个开放的授权协议,它提供一个方法可以让用户(User)授权第三方应用(Client)来访问用户保存在服务器(Server)上的资源。(不需要获得用户名和密码)。
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。目前互联网很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
OAUTH协议特点
简单:不管是OAUTH服务提供者还是应用开发者,都很容易于理解与使用;
安全:没有涉及到用户密钥等信息,更安全更灵活;
开放:任何服务提供商都可以实现OAUTH,任何软件开发商都可以使用OAUTH;
OAUTH相关的三个URL:
Request Token URL: 获取未授权的Request Token服务地址;
User Authorization URL: 获取用户授权的Request Token服务地址;Access Token URL: 用授权的Request Token换取Access Token的服务地址;
调查目标:实现QQ,新浪微薄,人人的账号进行身份验证。
调查结果:使用OAuth2.0实现。
说明:
1. OAuth2.0支持更好。——人人只支持OAuth2.0;新浪微薄,QQ支持OAuth1.0和OAuth2.0;QQ微薄支持的是OAuth1.0a;网易微薄,搜狐微薄等支持OAuth1.0。
2. OAuth2.0的好处在于实现起来更为简单(减少了访问Server的次数),安全性更高。每次得到的Access Token是变化的。
3. OAuth1.0存在安全隐患,但其得到的Access Token是不变的,更利于身份验证。
协议简介:
OAuth是一个开放的授权协议,它提供一个方法可以让用户(User)授权第三方应用(Client)来访问用户保存在服务器(Server)上的资源。(不需要获得用户名和密码)。
具体步骤:
1. 向Server申请App key和AppSecret,填写相关的资料(重点是设置redirect URL)
说明:
由于在QQ开放平台设置redirect URL时需要在网页中添加语句验证,所以Demo中QQ部分的演示没能实现。
2. 重定向浏览器到授权地址。等用户完成授权,得到Token。(Android使用了WebView)
说明:
1) 授权地址中需要传递的参数有:
Client ID | App key:936537698 |
Redirect URI | :www.example.com |
Response type | :code |
Example:https://api.weibo.com/oauth2/authorize?client_id=936537698&redirect_uri=http://www.example.com&response_type=code
2) 用户确认授权后,浏览器会重定向到redirect URI,返回的地址中带有一个token
Example:www.example.com/code=Code 此处的Code保存起来换取Access Token
3) 需要注意的是,由于OAuth2.0都是使用的https, 在Android中使用WebView访问地址时需要重写WebViewClient类onReceivedSslError函数,使其在遇到错误时继续访问。
3. 用前一步得到的Token换取Access Token和UID
说明:
1) 发送post请求。
2) 参数如下:
Client ID | App key:936537698 |
Client Secret | App Secret:775f63c…… |
Grant type | :authorization_code |
Code | :上一步得到的Code |
Redirect URI | :www.example.com |
3) 返回的是Josn数据,其包含的数据中有Access Token和UID对我们是有用的。(新浪与人人返回的Josn解析存在差异)。
4) 由于此处post到的依然是https的地址,所以需要对http Client进行一些处理。
4. 通过前一步得到的Access Token和UID向Server发送申请验证用户身份。
说明:
1) 发送get请求
2) 请求参数如下:
Access Token | :Josn数据中提取出来的access token |
UID | :新浪中需要使用,人人可省略 |
3) 人人传递Access Token时需要进行进一步的Encode编码。
4) 如果成功,返回的也是一个Josn数据,其中会包含用户UID。
新浪Example:https://api.weibo.com/2/users/show.json?access_token=2.00tdYkCCkOc4BB706734f555Rov12D&uid=1872914593