本次讲解腾讯微博OAuth认证的最后一步使用授权后的Request Token换取Access Token,当我们获取到Access Token后,我们就可以进行微博平台的资源访问。
照例我们先看下交换access_token的API:
交换access_token URL:https: // open.t.qq.com/cgi-bin/access_token 格式:xml,jsonHTTPS请求方式:GET是否需要鉴权: true 请求数限制: true 请求参数:oauth_callback:回调URL oauth_consumer_key:你申请的appkeyoauth_nonce:随机串(32个字符长度)oauth_signature:oauth请求签 名oauth_signature_method: 签 名方法(HMAC - SHA1)oauth_timestamp:时间戳oauth_token: request_tokenoauth_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_tokenoauth_token_secret: access_secretname: 微博帐户名 说明:
①本步骤用于签名的密钥为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用于执行请求,代码如下:
url = " https://open.t.qq.com/cgi-bin/access_token " ;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()方法我做了相应的修改,这个会在视频中给大家讲解,这里仅附上代码:
public static String getPostParams(String url, String httpMethod, String callBack, String tokenSecret,String oauthToken,String verifier) throws Exception{ // 保存参数集合 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账号,然后进入“应用”——“已授权应用”就可以看到我们授权的程序:
课程下载地址:
文档下载地址:
源码下载地址: