2013-04-17 61 views
0

我在我的網站上整合了登錄和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 
    } 
} 

我希望有人對此有什麼想法。提前致謝!

回答

0

你錯過了oauth_verifier

當從Twitter用戶返回後,他們已經點擊「是的,我同意這個應用程序的」,Twitter將回發到你oauth_tokenoauth_verifier

要獲取訪問令牌,您應該在oauth_verifier值的某處添加到parameterString。所以,假裝oauthVerifier是從Twitter的價值,parameterString地方應加入:

parameterString = parameterString + "&oauth_verifier=" + oauthVerifier

我還注意到,這一行使用parameterString2,不parameterString ......我從來沒有見過parameterString2定義

val baseString:String = "POST&"+URLEncoder.encode("https://api.twitter.com/oauth/access_token", "UTF-8")+"&"+URLEncoder.encode(parameterString2, "UTF-8") 
+0

我確實看到,我在這裏的代碼示例中有錯誤的URL。 「異步{ WS.url(」 https://api.twitter.com/oauth/request_token 「)」 應該ofcourse(而且是在我的代碼): 「異步{ WS.url(」 HTTPS ://api.twitter.com/oauth/access_token「)」 我會再次看看我的代碼,並返回到這裏的結果。編輯:parameterString2也是一個錯字在這裏,在我的代碼他們都命名爲parameterString :) – korrekorre

+0

感謝一堆! 「parameterString = parameterString +」&oauth_verifier =「+ oauthVerifier」就是答案!我努力了,而且我在twitter指南中看起來如此,以至於你應該通過身份驗證程序。現在我將它傳遞到標題中,它的工作完美無瑕。謝謝! – korrekorre

+0

我認爲參數字符串需要按照字母順序(詞法)。意思是oauth_verifier應該是倒數第二,而不是最後一個...... – Sam