oAuth认证是当下比较公认与应用较广泛的一种标准。使第三方应用可以安全的访问与操作其它应用程序。2.0相对于1.0来说,认证过程简化了许多,但不兼容1.0。2.0增加一个refreshToken的概念,每个返回的accessToken 都有一个有效期,过了有效期,需要refreshToken向服务器重新获得一个新的accessToken。Token相当于一个凭证一样,是该第三方应用访问其它应用的通行证。(也可以不设refreshToken, 比如说新浪微博就没有)

 

处理过程中,访问的url用android的WebView来显示,在WebViewClient中shouldOverrideUrlLoading(WebView view, String url)方法中处理重定向的url,并可以自定义显示自己本地asset中的网页。操作微博都是GET与POST请求。

 

认证过程:

以QQ微博为例:

1.  用一个QQ号在QQ微博网站上注册一个自己的应用,得到两个值:APP_KEY  APP_SECRET。

2.  在自己开发的第三方应用上授权

     授权即得到QQ微博给你自己开发的应用一个权力,可以操作QQ微博。2.0目前有两种授权模式,区别在于是否有自己的服务器。

  1. Authorization code grant,适合于有server端的应用授权(此认证方式分为两步,第一步是get请求,第二步是post请求)
  2. Implicit grant,适合于通过客户端访问的应用授权

    Authorization cod模式和Implicit模式仅在授权的时候有所区别,后续调用API的方式是一致的。

   

1.Authorization code grant

使用场景:
Authorization code授权适用于PC,无线客户端等需要和第三方server进行交互的应用场景。使用Authorization code授权,第三方能够集中处理用户的授权请求和授权结果,适用于有server端的应用。

授权流程:
Authorization code授权模式分为两步,首先获取code,然后用code换取accesstoken。

第一步:请求code

请求方法:
GET

请求地址:

https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=APP_KEY&response_type=code&redirect_uri=http://www.myurl.com/example

请求参数:

字段必须说明
client_id true 申请应用时分配的app_key
redirect_uri true 授权成功后的回调地址,即第三方应用的url
response_type true 授权类型,为code
wap false 主要用于指定手机授权页的版本,无此参数默认显示pc授权页面

wap=1时,跳转到wap1.0的授权页
wap=2时,跳转到wap2.0的授权页
不带本参数时,手机访问默认跳到wap2.0的授权页

state false 用于保持请求和回调的状态,授权请求成功后原样带回给第三方。该参数用于防止csrf攻击(跨站请求伪造攻击),强烈建议第三方带上该参数。参数设置建议为简单随机数+session的方式
forcelogin false 针对pc授权页
forcelogin=true,强制弹出登录授权页面 forcelogin=false,用户已经登录并且已经授权第三方应用,则不再弹出授权页面
默认为forcelogin=true

返回结果:
如果授权成功,授权服务器会将用户的浏览器重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:

http://www.myurl.com/example?code=CODE&openid=OPENID&openkey=OPENKEY

参数说明:

字段说明
code 用来换取accesstoken的授权码,有效期为10分钟
openid 用户统一标识,可以唯一标识一个用户
openkey 与openid对应的用户key,是验证openid身份的验证密钥

第二步:请求accesstoken

请求地址:

https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=APP_KEY&client_secret=APP_SECRET&redirect_uri=http://www.myurl.com/example&grant_type=authorization_code&code=CODE

请求参数:

字段必须说明
client_id true 申请应用时分配的app_key
client_secret true 申请应用时分配的app_secret
grant_type true authorization_code
code true 调用authorize时返回的code
redirect_uri true 回调地址,必须和请求code时的redirect_uri一致
state false 用于保持请求和回调的状态,授权请求成功后原样带回给第三方。该参数用于防止csrf攻击(跨站请求伪造攻击),强烈建议第三方带上该参数。参数设置建议为简单随机数+session的方式

返回结果:

access_token=ACCESS_TOKEN&expires_in=60&refresh_token=REFRESH_TOKEN

参数说明:

字段说明
access_token 访问第三方资源的凭证
expires_in accesstoken过期时间,以返回的时间的准,单位为秒,注意过期时提醒用户重新授权
refresh_token 刷新token

2.Implicit grant

使用场景:
Implicit grant授权适用于没有server端的客户端应用,由客户端发起授权请求,保存和处理accesstoken。

请求地址:

https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=APP_KEY&response_type=token&redirect_uri=http://www.myurl.com/example

请求参数:

字段必须说明
client_id true 申请应用时分配的app_key
redirect_uri true 授权回调地址,必须和应用注册的地址一致
response_type true 授权类型,为token
wap false 主要用于指定手机授权页的版本,无此参数默认显示pc授权页面

wap=1时,跳转到wap1.0的授权页
wap=2时,跳转到wap2.0的授权页
不带本参数时,手机访问默认跳到wap2.0的授权页

state false 用于保持请求和回调的状态,授权请求成功后原样带回给第三方。该参数用于防止csrf攻击(跨站请求伪造攻击),强烈建议第三方带上该参数。参数设置建议为简单随机数+session的方式
forcelogin false 针对pc授权页
forcelogin=true,强制弹出登录授权页面 forcelogin=false,用户已经登录并且已经授权第三方应用,则不再弹出授权页面
默认为forcelogin=true

返回结果:

http://www.myurl.com/example#access_token=ACCESS_TOKEN&expires_in=60&openid=OPENID&openkey=OPENKEY

参数说明:

字段说明
access_token accesstoken,访问api资源的凭证
expires_in accesstoken过期时间,以系统返回的过期时间为准,注意过期时提醒用户重新授权
openid 用户统一标识,可以唯一标识一个用户
openkey 与openid对应的用户key,是验证openid身份的验证密钥

刷新accesstoken

Oauth2中,accesstoken的有效期不是无限的,当第三方应用使用的acesstoken时间超过了其生命周期时,可以通过刷新机制来获取新的accesstoken。

请求地址

https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=APP_KEY&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

请求参数

字段必须说明
client_id true 申请应用时分配的app_key
grant_type true 固定为“refresh_token”
refresh_token true 上次授权或者刷新时获取的refresh_token

返回结果

返回字符串:

access_token=ACCESS_TOKEN&expires_in=60&refresh_token=REFRESH_TOKEN&name=NAME

参数说明

字段说明
access_token accesstoken,访问api资源的凭证
expires_in accesstoken过期时间,以系统返回的过期时间为准,注意过期时提醒用户重新授权
refresh_token 刷新token
name 授权用户微博帐号

注:
1)通过刷新机制可以延长access_token有效期,每次刷新延长的access_token有效期与授权时access_tken的有效期一致,多次刷新总的有效期为3个月;
2)使用implicit模式获取refresh_token时,为保证AppKey的安全,不要把app_secret放在客户端。

 

posted on 2013-03-27 11:17  Snow〃冰激凌  阅读(1854)  评论(0编辑  收藏  举报