搜狐微博XAuth使用举例
xAuth简介
使用xAuth认证方式,您仍然需要了解如何生成OAuth签名。
为了方便桌面应用和移动应用,特别是那些缺乏浏览器支持的应用,xAuth认证为这类应用提供了一种使用用户名和密码来获取OAuth的 Access Token的方式。 采用xAuth认证的桌面应用和移动应用可以跳过oauth/request_token(获取Request Token)以及oauth/authorize(授权Request Token)两步,只要提供了username和password以后,即可直接通过oauth/access_token接口得到Access Token。
使用xAuth
要使用xAuth认证,需要经过以下步骤:
1. 申请xAuth认证使用资格:现在Xauth权限已经对所有客户端类型应用直接开放。只要在申请应用时选择应用类型为“客户端”,都将直接开通Xauth权限。没有开通xauth权限的key将会返回403,forbidden。如果您已经获得xAuth使用权,请直接看第2步。
2. 获得xAuth的使用权后,为了能够生成OAuth签名,首先应该生成OAuth的BaseString。注意,生成BaseString时需要传入如下几个参数:
* x_auth_username:用户名
* x_auth_password:密码
* x_auth_mode:标识字段,这里必须是"client_auth"。
* oauth_consumer_key: 创建应用时生成的APP KEY。
* oauth_signature_method: 签名方法,建议使用“HMAC-SHA1”。
* oauth_timestamp:时间戳。生成Base String时的时间戳。
* oauth_nonce:单次值,一个随机字符串,防止重复攻击。
* oauth_version: OAuth协议版本。填写“1.0”。
生成的BaseString如下:
"POST&http%3A%2F%2Fapi.t.sohu.com%2Foauth%2Faccess_token&oauth_consumer_key%3D"+oauth_consumer_key+"%26"+
"oauth_nonce%3D"+noonce+"%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D"+time+"%26oauth_version%3D1.0"+
"%26x_auth_mode%3Dclient_auth%26x_auth_password%3D"+password+"%26x_auth_username%3D"+username;
3.根据oauth生成算法,.用刚刚生成的BaseString,经过HMAC-SHA1生成oauth_signature,注意这里的key是 consumer secret 后面加一个&,因为我们并没有oauth_token_secret,这是和oauth生成算法不一样的地方。生成key示例如下:
2u/xFErTc8vC1Z6R940HU3i5wAk=
URLEncode如下:
2u%2FxFErTc8vC1Z6R940HU3i5wAk%3D
4.根据以下参数向并向http://api.t.sohu.com/oauth/access_token接口提交POST请求:
·Httpheader 中的参数包括:
o oauth_consumer_key -
o oauth_nonce -
o oauth_signature_method - HMAC-SHA1
o oauth_timestamp - 1284565601
o oauth_version - 1.0
·HTTP post-body中包含的参数:
o x_auth_mode - client_auth
o x_auth_password – pwd
o x_auth_username – user_name
如下所示:
POST /oauth/access_token HTTP/1.1
Authorization: OAuth oauth_consumer_key="dbdP67NTrrNU0v2N6Yuu",oauth_version="1.0", oauth_signature_method="HMAC-SHA1",oauth_timestamp="1310372236", oauth_nonce="518611817947878737",oauth_signature="2u%2FxFErTc8vC1Z6R940HU3i5wAk%3D"
User-Agent: Java/1.6.0_13
Host: api.t.sohu.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-type: application/x-www-form-urlencoded
Content-Length: 78
x_auth_username=---------&x_auth_password=------&x_auth_mode=client_auth
5. 得到的返回结果示例如下:
oauth_token=b3d804ee16d9d92820fb2f188203909a&oauth_token_secret=c2d687416889d575575ed8c2694a208b&user_id=100945678&screen_name=..&x_auth_expires=0
将返回结果按"&"拆开,oauth_token的值即为access_token。
6.如何使用access_token和oauth_token_secret来调用接口. 这里我们以查看用户详细信息为例子介绍。http://api.t.sohu.com/users/show.json
OAuthConsumer consumer = new DefaultOAuthConsumer(
"dbdP67NTrrNU0v2N6Yuu",consumer_secret);
// access_token和 access_token_secret consumer.setTokenWithSecret("b3d804ee16d9d92820fb2f188203909a","c2d687416889d575575ed8c2694a208b");
URL url = new URL("http://api.t.sohu.com/users/show.json");
HttpURLConnection request;
request = (HttpURLConnection)url.openConnection();
request.setDoOutput(true);
request.setRequestMethod("GET");
System.out.println("Sendingrequest...");
consumer.sign(request);
request.connect();
System.out.println("Response: " +request.getResponseCode() + " "
+ request.getResponseMessage());
BufferedReader reader =newBufferedReader(new InputStreamReader(request.getInputStream()));
String b = null;
while((b = reader.readLine())!=null){
System.out.println(b);
}
request.disconnect();
}
得到结果如下:
{"id":"100945678","screen_name":"未见见","name":"","location":"北京市,海淀区","description":"","url":"","profile_image_url":"http://s4.cr.itc.cn/mblog/icon/3d/6f/m_13080399324892.jpg","protected":true,"followers_count":62,"profile_background_color":"","profile_text_color":"","profile_link_color":"","profile_sidebar_fill_color":"","profile_sidebar_border_color":"","friends_count":213,"created_at":"MonMay 09 20:09:06 +08002011","favourites_count":1,"utc_offset":"","time_zone":"","profile_background_image_url":"","notifications":"","geo_enabled":false,"statuses_count":264,"following":true,"verified":false,"lang":"zh_cn","contributors_enabled":false}
HTTP 请求如下:
GET /users/show.json HTTP/1.1
Authorization: OAuthoauth_token="b3d804ee16d9d92820fb2f188203909a",oauth_consumer_key="dbdP67NTrrNU0v2N6Yuu", oauth_version="1.0",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1310437374",oauth_nonce="-4185729389431891046", oauth_signature="tEvVrQobzXoyJYqLq7qxApPQJks%3D"
User-Agent: Java/1.6.0_13
Host: api.t.sohu.com
Accept: text/html, image/gif,image/jpeg, *; q=.2, */*; q=.2