Web サイトで Login と Twitter を統合していますが、今は完全に行き詰っています。私はこのガイドに従っています: ( https://dev.twitter.com/docs/auth/implementing-sign-twitter ) Play フレームワークを使用して Scala で実行しています。
多くの人が常に 401 Unauthorized エラーを受け取っていることを読んだことがあり、以前の「ステップ 1: リクエスト トークンの取得」でもそうでしたが、ここで見つけた oauth_callback_url を渡さないことで解決しました: https:/ /github.com/cyrus7580/twitter_api_examples/blob/master/src/SampleTwitterRequests.java
今、私の問題は、最後のステップである「ステップ 3: リクエスト トークンをアクセス トークンに変換する」にあります...問題は、oauth/access_token エンドポイントに POST を実行しているときです。401 - Unauthorized - Invalid リクエスト トークンを受け取ります。
「ステップ 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
}
}
誰かがこれについて考えてくれることを願っています。前もって感謝します!