我在我的網站上整合了登錄和Twitter,我現在完全陷入僵局。 我遵循本指南:(https://dev.twitter.com/docs/auth/implementing-sign-twitter),並使用Play框架在Scala中執行此操作。卡住使用Scala從Twitter API獲取訪問令牌
我讀過很多人一直得到401未經授權的錯誤,以及我之前對「第1步:獲取請求令牌」的解答,但是我沒有通過我在這裏發現的oauth_callback_url來解決它:https://github.com/cyrus7580/twitter_api_examples/blob/master/src/SampleTwitterRequests.java
現在我的問題是「步驟3:將請求令牌轉換爲訪問令牌」,最後一步......問題是當我對POST端口進行oauth/access_token時。我得到401 - 未經授權 - 無效的請求令牌。
我從「步驟2」中獲得了請求令牌和驗證者。
我的代碼如下所示步驟3:
val token = "R6qe*********************PbTAvlHw" //Got this from step 2
val verifier = "s1jWnOz********************eJEU" //Got this from step 2
val twitterConsumerKey = "iLRU**********uQ"
val twitterConsumerSecret = "DsdGs***********dgfd2"
val signatureMethod = "HMAC-SHA1"
val version = "1.0"
val nonce = getNonce() //method return a 32character random nonce (worked in step 2)
val timeStamp = (System.currentTimeMillis/1000).toString
val parameterString:String =
"oauth_consumer_key=" + twitterConsumerKey +
"&oauth_nonce=" + nonce +
"&oauth_signature_method=" + signatureMethod +
"&oauth_timestamp=" + timeStamp +
"&oauth_token=" + URLEncoder.encode(token, "UTF-8") +
"&oauth_version=" + version
val baseString:String = "POST&"+ URLEncoder.encode("https://api.twitter.com/oauth/access_token", "UTF-8")+"&"+ URLEncoder.encode(parameterString2, "UTF-8")
val signature = getSignature(twitterConsumerSecret, baseString, "HmacSHA1")
val data = "OAuth " +
"oauth_consumer_key=\"" + twitterConsumerKey +
"\",oauth_signature_method=\"" + signatureMethod +
"\",oauth_timestamp=\"" + timeStamp +
"\",oauth_nonce=\"" + nonce +
"\",oauth_version=\"" + version +
"\",oauth_signature=\"" + signature +
"\",oauth_token=\"" + URLEncoder.encode(token, "UTF-8") + "\""
Async{
WS.url("https://api.twitter.com/oauth/request_token").withHeaders("Authorization" -> data).post("oauth_verifier="+URLEncoder.encode(verifier, "UTF-8")).map(response => {
Logger.info(response.body.toString()) //Invalid request token
Logger.info(response.status.toString) //401
Logger.info(response.statusText) //Unauthorized
Ok("Welcome")
})
}
的getSignature(twitterConsumerSecret,即basestring, 「HMACSHA1」)是這樣的:
def getSignature(consumerSecret:String, baseString:String, algorithm:String):String = {
val key:String = consumerSecret + "&"
val signingKey:SecretKeySpec = new SecretKeySpec(key.getBytes(), algorithm)
try{
var mac: Mac = null;
mac = Mac.getInstance(algorithm);
mac.init(signingKey);
val rawHmac:Array[Byte] = mac.doFinal(baseString.getBytes());
val oauth_signature:String = new sun.misc.BASE64Encoder().encode(rawHmac)
val oauth_signatureFinal:String = URLEncoder.encode(oauth_signature, "UTF-8")
return oauth_signatureFinal
}
}
我希望有人對此有什麼想法。提前致謝!
我確實看到,我在這裏的代碼示例中有錯誤的URL。 「異步{ WS.url(」 https://api.twitter.com/oauth/request_token 「)」 應該ofcourse(而且是在我的代碼): 「異步{ WS.url(」 HTTPS ://api.twitter.com/oauth/access_token「)」 我會再次看看我的代碼,並返回到這裏的結果。編輯:parameterString2也是一個錯字在這裏,在我的代碼他們都命名爲parameterString :) – korrekorre
感謝一堆! 「parameterString = parameterString +」&oauth_verifier =「+ oauthVerifier」就是答案!我努力了,而且我在twitter指南中看起來如此,以至於你應該通過身份驗證程序。現在我將它傳遞到標題中,它的工作完美無瑕。謝謝! – korrekorre
我認爲參數字符串需要按照字母順序(詞法)。意思是oauth_verifier應該是倒數第二,而不是最後一個...... – Sam