搜狐微博XAuth使用举例

来源:互联网 发布:爱淘宝每天抽红包 编辑:程序博客网 时间:2024/06/06 18:21

搜狐微博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