zoukankan      html  css  js  c++  java
  • 6.腾讯微博Android客户端开发——换取Access Token .

    本次讲解腾讯微博OAuth认证的最后一步使用授权后的Request Token换取Access Token,当我们获取到Access Token后,我们就可以进行微博平台的资源访问。

    照例我们先看下交换access_token的API:

    交换access_token

    URLhttps://open.t.qq.com/cgi-bin/access_token

    格式:xml,json

    HTTPS请求方式:GET

    是否需要鉴权:true

    请求数限制:true

    请求参数:

    oauth_callback:回调URL

    oauth_consumer_key:你申请的appkey

    oauth_nonce:随机串(32个字符长度)

    oauth_signatureoauth请求签

    oauth_signature_method 名方法(HMAC-SHA1

    oauth_timestamp:时间戳

    oauth_token: request_token

    oauth_version oauth版本号填(1.0

    oauth_verifier:验证码

     

    使用示例如下:

    https://open.t.qq.com/cgi-bin/access_token?oauth_consumer_key=0aae7ba5c10d4b939694b0b3b9ffe8ac&oauth_nonce=35885b07fe7dc53942d405e552d086fe&oauth_signature=TXBihj%2FH4avLJaWmjYARDVVCu8M%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1288933101&oauth_token=66ae88faecd14a1f8e826d35d5e857a7&oauth_verifier=335566&oauth_version=1.0

     

    返回结果:

    oauth_token=ffc37464473e48a2b22226350dc98210&oauth_token_secret=3fe92ec42e936672ceca549d432c237d&name=starjiang

     

    返回结果说明:

    oauth_token: access_token

    oauth_token_secret: access_secret

    name: 微博帐户名

    说明:

    本步骤用于签名的密钥为App Secret和Request Token Secret(中间使用&分隔)

    ②获得返回值后就可以使用Access Token来访问资源了。

    ③Access Token和Access Token Secret永远不会过期,直到用户撤销应用授权或腾讯回收您的app访问权限才会失效。

    通过API的我们可知请求URL为https://open.t.qq.com/cgi-bin/access_token,传递的参数个数为9个,但是官方给出的使用示例中传递的参数为8个,其中oauth_callback并未传递,个人认为是API提供错误,因为在前面的请求中我们已经指定了oauth_callback,我编写代码的时候也是没有传递oauth_callback。另外oauth_verifier即为我们在上一节中获取的验证码。同时还有一点要注意的是我们在生成签名的时候密钥是有两部分组成的:App Secret和Request Token Secret,其中Request Token Secret既是我们在获取未授权的Token中的返回值oauth_token_secret的值。

    由于我们在请求时需要传递验证码,因此我在界面中添加了一个EditText用来接收用户输入的验证码:

    同时添加了一个Button用于执行请求,代码如下:

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

    • Map<String, String> map = new HashMap<String, String>();  
    • try  
    • {  
    •     params = OAuth.getPostParams(url, httpMethod,null, tokenSecret, oauthToken, verifier);  
    •     SyncHttp http = new SyncHttp();  
    •     String response = http.httpGet(url, params);  
    •     map = TextUtil.splitResponse(response);  
    • catch (Exception e)  
    • {  
    •     e.printStackTrace();  
    • }  
    • return map;  

    在这里要注意的是OAuth中的getPostParams()方法我做了相应的修改,这个会在视频中给大家讲解,这里仅附上代码:

    1. public static String getPostParams(String url, String httpMethod, String callBack, String tokenSecret,String oauthToken,String verifier) throws Exception  
    2. {  
    3.     // 保存参数集合   

    •     List<Parameter> params = new ArrayList<Parameter>();  
    •     // 获取时间戳   
    •     String timestamp = generateTimeStamp();  
    •     // 获取单次值   
    •     String nonce = generateNonce();  
    •     // 添加参数   
    •     params.add(new Parameter("oauth_consumer_key", CONSUMER_KEY));  
    •     params.add(new Parameter("oauth_signature_method", SIGNATURE_METHOD));  
    •     params.add(new Parameter("oauth_timestamp", timestamp));  
    •     params.add(new Parameter("oauth_nonce", nonce));  
    •     params.add(new Parameter("oauth_version""1.0"));  
    •     if (!TextUtil.isEmpty(callBack))  
    •     {  
    •         params.add(new Parameter("oauth_callback", callBack));  
    •     }  
    •     //验证码   
    •     if (!TextUtil.isEmpty(verifier))  
    •     {  
    •         params.add(new Parameter("oauth_verifier", verifier));  
    •     }  
    •     //oauthToken   
    •     if (!TextUtil.isEmpty(oauthToken))  
    •     {  
    •         params.add(new Parameter("oauth_token", oauthToken));  
    •     }  
    •   
    •     // 获取签名值   
    •     String signature = generateSignature(httpMethod, url, params, CONSUMER_SECRET, tokenSecret);  
    •     params.add(new Parameter("oauth_signature", signature));  
    •   
    •     // 构造请求参数字符串   
    •     StringBuilder urlBuilder = new StringBuilder();  
    •     for (Parameter param : params)  
    •     {  
    •         urlBuilder.append(param.getName());  
    •         urlBuilder.append("=");  
    •         urlBuilder.append(param.getValue());  
    •         urlBuilder.append("&");  
    •     }  
    •     // 删除最后“&”字符   
    •     urlBuilder.deleteCharAt(urlBuilder.length() - 1);  
    •     Log.i(TAG, "params="+urlBuilder.toString());  
    •     return urlBuilder.toString();  
    • }  

    通过上面的代码我们就可以获取到Access Token,整个程序执行流程如下图表示:

    通过上面的流程,我们发现在授权的过程中还需要用户的操作,既手动输入验证码,这样使我们的程序显得非常不友好。我也在参考其它的资料寻找解决方法,现在还找研究中,不管是否成功,在下一节课中会分享下思路,同时也期待各位朋友介绍更好的解决方案。

    另外如果认证成功,我们可登陆open.t.qq.com,输入认证QQ账号,然后进入“应用”——“已授权应用”就可以看到我们授权的程序:

    课程下载地址:http://u.115.com/file/e60jb8jl

    文档下载地址:http://download.csdn.net/source/3405215

    源码下载地址:http://u.115.com/file/dn4kdfdt

    原文:http://blog.csdn.net/coolszy/article/details/6576536

  • 相关阅读:
    p1012拼数题解
    LeetCode OJ :Unique Binary Search Trees II(唯一二叉搜索树)
    UVA 11827 Maximum GCD
    LightOJ1336 Sigma Function(约数和为偶数的个数)
    LightOJ 1197 Help Hanzo(区间素数筛选)
    LightOJ 1236
    BZOJ3339 Rmq Problem
    COJ983 WZJ的数据结构(负十七)
    LCA的五种解法
    hdu4223(dp)
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2116234.html
Copyright © 2011-2022 走看看