本文介绍安卓接入推特授权登录以及一些坑
推特因为不再维护sdk,所以在根据文档接入的时候碰到了SSL Certificate Pinning Error,按照网上的修改注释源代码也会出现ssl相关的报错,
也就是以下这段授权登录代码:
TwitterAuthClient.authorize(activity, new Callback<TwitterSession>());
所以后来采用的方案是用http请求推特的服务端,部分依赖sdk相关的接口。
____________________________________________________________________________________________________________________
文档链接
____________________________________________________________________________________________________________________
1.请求oauthToken和oauthTokenSecret
首先需要准备推特的参数:ConsumerKey, ConsumerSecret
在请求之前需要先准备好几个方法生成相关的参数:
生成请求头Authorization值
参考代码:com\twitter\sdk\android\core\internal\oauth\OAuth1aParameters.java
可以参考它的重新写一个管理推特参数相关的单例。
其中OAuth1aParameters需要设置的参数为:
TwitterAuthConfig->new TwitterAuthConfig(ConsumerKey, ConsumerSecret)
TwitterAuthToken->null
callback->twittersdk://callback //应该需要在后台也设置下
method->POST
url->https://api.twitter.com/oauth/request_token
postParams->null
http post请求头需要设置2个键值对:Content-Type和Authorization
String head = constructAuthorizationHeader(nonce, timestamp, signature);
其中nonce,timestamp和signature参考示例代码中的getAuthorizationHeader()方法
Content-Type:application/x-www-form-urlencoded
Authorization:head
请求地址:https://api.twitter.com/oauth/request_token
请求成功的话会返回oauth_token=xxx&oauth_token_secret=yyy,这两个值会在后面用到
2.打开用户授权登录界面
需要打开的url:https://api.twitter.com/oauth/authenticate?oauth_token=xxx
打开后会在浏览器中显示一个推特用户授权登录的网页
这里需要重写一个webview,实现webView.setWebViewClient,用户授权登录成功后会在shouldOverrideUrlLoading里返回一个url
url中包含oauth_verifier的值,如果url里包含denied则说明是用户取消了,也可以中断后续的步骤
3.获取校验登录用的值发给服务端验证登录
类似第一步,OAuth1aParameters需要设置的参数为:
TwitterAuthConfig->new TwitterAuthConfig(ConsumerKey, ConsumerSecret)
TwitterAuthToken->new TwitterAuthToken(oauthToken, oauthTokenSecret)
callback->twittersdk://callback //应该需要在后台也设置下
method->POST
url->https://api.twitter.com/oauth/access_token
postParams->null
http post请求头需要设置3个键值对:Content-Type、Authorization和Content-Length
String head = constructAuthorizationHeader(nonce, timestamp, signature);
其中nonce,timestamp和signature参考示例代码中的getAuthorizationHeader()方法
String body = String.format("oauth_verifier=%s", oauthVerifier); //这个是请求体中的值,不是请求头的,请求头只需要知道它的长度是几位的
Content-Type:application/x-www-form-urlencoded
Authorization:head
Content-Length:String.valueOf(body.length())
请求地址:https://api.twitter.com/oauth/access_token
请求成功的话会返回oauth_token=xxx&oauth_token_secret=yyy&user_id=zzz
拿到这里的token、secret和uid后,就可以发给服务端去推特服务器那边校验结果,通过的话就可以回调给cp登录结果了
完事收工!
网友评论