0

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
  }
}

誰かがこれについて考えてくれることを願っています。前もって感謝します!

4

1 に答える 1

0

あなたは行方不明ですoauth_verifier

ユーザーが [はい、このアプリを承認します] をクリックした後に Twitter から戻ると、Twitter はあなたに返信しoauth_tokenoauth_verifier.

アクセス トークンを取得するには、parameterStringどこかにoauth_verifier値を追加する必要があります。したがって、oauthVerifier が Twitter からの値であると仮定して、parameterStringどこかに追加する必要があります。

parameterString = parameterString + "&oauth_verifier=" + oauthVerifier

また、この行が parameterString ではなく parameterString2 を使用していることにも気付きました... parameterString2 が定義されているのを見たことがありません

val baseString:String = "POST&"+URLEncoder.encode("https://api.twitter.com/oauth/access_token", "UTF-8")+"&"+URLEncoder.encode(parameterString2, "UTF-8") 
于 2013-04-17T20:10:44.297 に答える