0

具体的には、OAuth 1 トークン リクエストに署名しようとしています。

https://api.twitter.com/oauth/request_token

GitHub Gist HERE、読みやすい:

  def timestamp: String = (System.currentTimeMillis / 1000).toString;
  def nonce: String = System.nanoTime.toString

  /**
   * Generates the OAuth 1 header for a request.
   */
  def oauthHeader(
    endPoint: String,
    requestMethod: String,
    consumerKey: String,
    callback: String,
    params: List[(String, String)] = List()): String = {
    val signature = sign(endPoint, requestMethod, consumerKey);
    val oauthParams: List[(String, String)] = params :::
      (OAuthParams.oauth_consumer_key -> consumerKey) ::
      (OAuthParams.oauth_callback -> URLEncoder.encode(callback, UTF_8)) ::
      (OAuthParams.oauth_nonce -> nonce) ::
      (OAuthParams.oauth_timestamp -> timestamp) ::
      (OAuthParams.oauth_signature -> signature) ::
      (OAuthParams.oauth_signature_method -> "HMAC-SHA1") ::
      (OAuthParams.oauth_version -> "1.0") :: Nil

    val encodedParams = oauthParams.sortBy(_._1) map (header => {
      header._1 + "=" + "\"" + header._2 + "\""
    })

    OAuthParams.oauth + " " + encodedParams.mkString(", ")
  }

  def sign(endPoint: String,
    requestMethod: String,
    consumerKey: String,
    params: List[(String, String)] = List()): String = {

    /**
     * The map of OAuth params.
     * Added to every request.
     */
    val oauthParams: List[(String, String)] = params :::
      (OAuthParams.oauth_consumer_key -> consumerKey) ::
      (OAuthParams.oauth_nonce -> nonce) ::
      (OAuthParams.oauth_timestamp -> timestamp) ::
      (OAuthParams.oauth_signature_method -> "HMAC-SHA1") ::
      (OAuthParams.oauth_version -> "1.0") ::
      Nil

    /**
     * Percent encoded List of parameters.
     */
    val signatureMap = oauthParams.sortBy(_._1).map(header => {
      URLEncoder.encode(header._1 + "=" + header._2, UTF_8)
    });

    /**
     * Add the request method.
     */
    val encodedHeader = requestMethod ::
      URLEncoder.encode(endPoint, UTF_8) ::
      URLEncoder.encode(oauthParams.mkString("&"), UTF_8) :: Nil

    URLEncoder.encode(hmacSha1(encodedHeader.mkString("&"), signinKey), UTF_8);
  }

  def hmacSha1(value: String, key: String): String = {
    val keyBytes = key.getBytes();
    val signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
    val mac = Mac.getInstance("HmacSHA1");
    mac.init(signingKey);
    val rawHmac = mac.doFinal(value.getBytes());
    Base64.encodeBase64String(rawHmac)
  }

私は取得し続けます: oauth 署名とトークンを検証できませんでした。

提供された:

  • アプリケーションが登録されました
  • アプリの設定で「Twitterでサインイン」が有効になっている

私は何を間違っていますか?

4

2 に答える 2

0

最初に目にする問題は、ノンスとタイムスタンプの生成に関するものです。これらはどちらも、呼び出されるたびに異なる値を生成する可能性があるメソッドです。ヘッダーではなく署名にこれらの値が異なる場合、サーバーは、提供したものと一致しない別の署名を生成します。

図書館の利用を考えたことはありますか?

DispatchPlay WS APIの両方が OAuth リクエストをサポートしていることは知っています。Play! Signpostを使用しており、OAuth ウェブサイトhttp://oauth.googlecode.com/svn/code/java/のこのコードを使用して、Java でも運が良かったです。

于 2013-09-02T18:00:44.993 に答える
0

独自の OAuth 1.0a 要求署名者を展開することができました。

これがその HMAC-SHA1 部分です。

https://gist.github.com/alexflav23/6407319

完全な実装はnet.databinder.dispatchプル リクエストで行います。

于 2013-09-03T00:22:31.993 に答える