4.腾讯微博Android客户端开发——获取未授权的Request Token

转自:http://blog.csdn.net/coolszy/archive/2011/06/15/6547117.aspx

 

前面给大家介绍过腾讯微博API通过以下步骤来完成认证授权:

1.获取未授权的Request Token(temporary credentials)

2.请求用户授权Request Token

3.使用授权后的Request Token换取Access Token(token credentials)

本次给大家介绍如何获取未授权的Request Token。

在腾讯微博开放平台的API中介绍了获取Request Token的URL地址、所需要的参数以及返回内容。

 

获取request_token 

URL:https://open.t.qq.com/cgi-bin/request_token

格式:xml,json

HTTPS请求方式:GET

是否需要鉴权:true

请求数限制:true

请求参数:

oauth_callback:回调URL 如果是桌面应用或手机应用没有回调URL,采用pin码方式,请填上 oauth_callback=null

oauth_consumer_key:你申请的appkey

oauth_nonce:随机串(32个字符长度)随机生成,只能使一次,与时间戳一起 防重放

oauth_signature:oauth请求签名 oauth请求的签名,根据oauth协议中算法生成basestring 后,用appsecret 对basestring 经hmac_sha1生成的签名串

oauth_signature_method:签名方法(HMAC-SHA1)

oauth_timestamp:时间戳 你的请求当前时间戳 (你的服务器时间你定要准确,不然请求会被拒绝掉)

oauth_version:oauth版本号(填 1.0 )

使用示例如下:

https://open.t.qq.com/cgi-bin/request_token?oauth_callback=http%3A%2F%2Fqunmgr.qq.com%2Foauthapi%2Fcallback.php&oauth_consumer_key=0aae7ba5c10d4b939694b0b3b9ffe8ac&oauth_nonce=b788149731e0ed75daa03a6e1e30427c&oauth_signature=zO5%2FgT%2FP6tbhBBZVuoyfjPwjdxY%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1288932298&oauth_version=1.0

返回结果:

oauth_token=a63f4a0e1242462fb8c11e53159ba294&oauth_token_secret=40ece707e064128e4fec692e3c09c692&oauth_callback_confirmed=true

返回结果说明:

oauth_token:返回的request_token

oauth_token_secret:返回的request_secret

oauth_callback_confirmed:回调确认

使用流程图表示则十分的简单:

 

其中URL地址和请求方式我们已经可以直接指定:

 

  1. String url = "https://open.t.qq.com/cgi-bin/request_token";  
  2. String httpMethod = "GET";  

 

请求所需的参数除了oauth_signature外我们都可以直接指定或者调用前面将结果的方法:

 

  1. List params = new ArrayList();  
  2. String timestamp = generateTimeStamp();  
  3. String nonce = generateNonce(false);  
  4. params.add(new Parameter("oauth_consumer_key", CONSUMER_KEY));  
  5. params.add(new Parameter("oauth_signature_method", SIGNATURE_METHOD));  
  6. params.add(new Parameter("oauth_timestamp", timestamp));  
  7. params.add(new Parameter("oauth_nonce", nonce));  
  8. params.add(new Parameter("oauth_callback""null"));  
  9. params.add(new Parameter("oauth_version""1.0"));  

 

同时发送请求和处理返回信息的方法在前面已给大家介绍,我们也可直接调用:

 

  1. try  
  2. {  
  3. SyncHttp http = new SyncHttp();  
  4. String result = http.httpGet(url, params);  
  5. catch (Exception e)  
  6. {  
  7. e.printStackTrace();  
  8. }  

 

下面我们所需要处理的就是得到oauth_signature的值。

通过阅读帮助文档我们可得知oauth_signature是将请求源串以及密钥根据一定签名方法生成的签名值,用来提高传输过程参数的防篡改性。

签名值的生成共有3个步骤:构造源串,构造密钥,生成签名值。

Step 1.构造源串

第1步:将请求的URI路径进行URL编码。

第2步:将除“oauth_signature”外的所有参数按key进行字典升序排列。

第3步:将第2步中排序后的参数(key=value)用&拼接起来,并进行URL编码。

第4步:将HTTP请求方式(GET或者POST)以及第1步和第3步中的字符串用&拼接起来。

Step 2. 构造密钥

密钥由2部分内容用“&”拼接起来:

oauth_consumer_secret & oauth_token_secret

Step 3. 生成签名值

1. 使用HMAC-SHA1加密算法,将Step1中的到的源串以及Step2中得到的密钥进行加密。

2. 然后将加密后的字符串经过Base64编码,即得到oauth_signature签名参数的值。

代码如下:

 

  1. String tokenSecret = "";  
  2. // App Key  
  3. String consumer_key = "dabd7b3bdf744acc9777a506c74c285e";  
  4. // App Secret  
  5. String consumer_secret = "04fb0ca42cb64ab06ef606b49579c9cb";  
  6. // 签名方法  
  7. String signature_method = "HMAC-SHA1";  
  8. // 请求URL  
  9. String url = "https://open.t.qq.com/cgi-bin/request_token";  
  10. // 请求方式  
  11. String httpMethod = "GET";  
  12.   
  13. // 保存参数集合  
  14. List<Parameter> params = new ArrayList<Parameter>();  
  15. // 得到时间戳  
  16. String timestamp = generateTimeStamp();  
  17. // 单次值  
  18. String nonce = generateNonce();  
  19. // 添加参数  
  20. params.add(new Parameter("oauth_consumer_key", consumer_key));  
  21. params.add(new Parameter("oauth_signature_method", signature_method));  
  22. params.add(new Parameter("oauth_timestamp", timestamp));  
  23. params.add(new Parameter("oauth_nonce", nonce));  
  24. params.add(new Parameter("oauth_callback""null"));  
  25. params.add(new Parameter("oauth_version""1.0"));  
  26.   
  27. // Step 1.构造源串:HTTP请求方式 & urlencode(uri) & urlencode(a=x&b=y&...)  
  28. StringBuilder baseStringBuilder = new StringBuilder();  
  29. baseStringBuilder.append(httpMethod);  
  30. baseStringBuilder.append("&");  
  31. baseStringBuilder.append(encode(url));  
  32. baseStringBuilder.append("&");  
  33. // 所有参数按key进行字典升序排列  
  34. Collections.sort(params);  
  35. for (Parameter param : params)  
  36. {  
  37.     String name = encode(param.getName());  
  38.     String value = encode(param.getValue());  
  39.     baseStringBuilder.append(name);  
  40.     baseStringBuilder.append("%3D"); // 字符 =  
  41.     baseStringBuilder.append(value);  
  42.     baseStringBuilder.append("%26"); // 字符 &  
  43. }  
  44. // 删除末尾的%26  
  45. baseStringBuilder.delete(baseStringBuilder.length() - 3, baseStringBuilder.length());  
  46. String baseString = baseStringBuilder.toString();  
  47.   
  48. // Step 2. 构造密钥  
  49. String oauthKey = "";  
  50. if (null == tokenSecret || tokenSecret.equals(""))  
  51. {  
  52.     oauthKey = encode(consumer_secret) + "&";  
  53. else  
  54. {  
  55.     oauthKey = encode(consumer_secret) + "&" + encode(tokenSecret);  
  56. }  
  57.   
  58. // 生成签名值  
  59. byte[] encryptBytes = HMAC_SHA1.HmacSHA1Encrypt(baseString, oauthKey);  
  60. String signature = Base64.encode(encryptBytes);  
  61.   
  62. params.add(new Parameter("oauth_signature", signature));  
  63.   
  64. // 构造传递参数字符串  
  65. StringBuilder urlBuilder = new StringBuilder();  
  66. for (Parameter param : params)  
  67. {  
  68.     urlBuilder.append(param.getName());  
  69.     urlBuilder.append("=");  
  70.     urlBuilder.append(param.getValue());  
  71.     urlBuilder.append("&");  
  72. }  
  73. urlBuilder.deleteCharAt(urlBuilder.length() - 1);  
  74. String urlParams = urlBuilder.toString();  
  75.   
  76. SyncHttp http = new SyncHttp();  
  77. String result = http.httpGet(url, urlParams);  
  78. System.out.println(result);  

 

通过上面代码我们就能获取平台传递过来的信息,当然代码显得比较臃肿,课中中会分割在几个方法中。正常的返回结果为:

oauth_token=079ad6989409456a9878bf41ca8d2d7a&oauth_token_secret=b494075906b8846416735bf802ced89f&oauth_callback_confirmed=true

我们可以编写一个辅助方法获取每个返回参数的值,已供以后使用:

 

  1. /** 
  2.  * 分割返回结果 
  3.  *  
  4.  * @param response 
  5.  *            返回字符串 
  6.  * @return 
  7.  */  
  8. public static Map<String, String> splitResponse(String response)  
  9. {  
  10.     // 保存返回结果  
  11.     Map<String, String> map = new HashMap<String, String>();  
  12.     // 判断是否为空  
  13.     if (!TextUtil.isEmpty(response))  
  14.     {  
  15.         // 已“&”进行分割  
  16.         String[] array = response.split("&");  
  17.         if (array.length > 2)  
  18.         {  
  19.             String tokenStr = array[0]; // oauth_token=xxxxx  
  20.             String secretStr = array[1];// oauth_token_secret=xxxxxxx  
  21.             String[] token = tokenStr.split("=");  
  22.             if (token.length == 2)  
  23.             {  
  24.                 map.put("oauth_token", token[1]);  
  25.             }  
  26.             String[] secret = secretStr.split("=");  
  27.             if (secret.length == 2)  
  28.             {  
  29.                 map.put("oauth_token_secret", secret[1]);  
  30.             }  
  31.         }  
  32.     }  
  33.     return map;  
  34. }  

 

课程下载地址:http://u.115.com/folder/f6161918260 
文档下载地址:http://www.docin.com/p-220252513.html 
源码下载地址:http://u.115.com/folder/f611696b2f6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值