【问题标题】:Yet another "Failed to validate oauth signature and token"另一个“无法验证 oauth 签名和令牌”
【发布时间】:2013-09-12 10:03:31
【问题描述】:

我遇到了许多其他人都经历过的问题。我做的一切都是正确的,但我仍然收到这个烦人的“无法验证 oauth 签名和令牌”错误:)

嗯,我猜肯定是有什么问题..

我正在尝试通过在“https://api.twitter.com/oauth/request_token”上发布带有标题的帖子来获取 request_token:

Authorization:
 OAuth oauth_consumer_key="MYVq....................ywj2g",
       oauth_nonce="m8NG0s4oc87AOIpuILafAeI1YoMv5Mu9",
       oauth_signature="Bxb%252FFIfOG9KLVj%252FUNdV%252FycVlGPs%253D",
       oauth_signature_method="HMAC-SHA1",
       oauth_timestamp="1378976842",
       oauth_version="1.0"

但它抱怨签名和令牌。 我的签名是否以某种方式无效? 对于这个请求,我不需要令牌吗??

我不知道怎么回事。

这是我的一些 getRequestToken 代码:

val oauth_consumer_key: String      = CONSUMER_KEY
val oauth_nonce: String             = generateNonce()
val oauth_timestamp: String         = (System.currentTimeMillis / 1000).toString
var oauth_signature: String         = ""
val oauth_signature_method: String  = "HMAC-SHA1"
val oauth_version: String           = "1.0"

val PARAMETER_STRING: String =
  "oauth_consumer_key=" + oauth_consumer_key + "&" +
  "oauth_nonce=" + oauth_nonce + "&" +
  "oauth_signature_method=" + oauth_signature_method + "&" +
  "oauth_timestamp=" + oauth_timestamp + "&" +
  "oauth_version=" + oauth_version

val BASE_STRING: String =
  "POST&" + URLEncoder.encode("https://api.twitter.com/oauth/request_token", "UTF-8") + "&" + URLEncoder.encode(PARAMETER_STRING, "UTF-8")

oauth_signature = getSignature(CONSUMER_SECRET, BASE_STRING, "HmacSHA1")

val AUTHORIZATION = "OAuth " +
  "oauth_consumer_key=\"" + URLEncoder.encode(oauth_consumer_key, "UTF-8") +
  "\", oauth_nonce=\"" + URLEncoder.encode(oauth_nonce, "UTF-8") +
  "\", oauth_signature=\"" + URLEncoder.encode(oauth_signature, "UTF-8") +
  "\", oauth_signature_method=\"" + URLEncoder.encode(oauth_signature_method, "UTF-8") +
  "\", oauth_timestamp=\"" + URLEncoder.encode(oauth_timestamp, "UTF-8") +
  "\", oauth_version=\"" + URLEncoder.encode(oauth_version, "UTF-8") + "\""

WS.url("https://api.twitter.com/oauth/request_token").withHeaders("Authorization" -> AUTHORIZATION).post(Results.EmptyContent()).map(response => {
  if(response.status != 200) Logger.error(response.body) //THIS IS WHERE I GET THE ERROR
  else {

    if((response.json \ "oauth_callback_confirmed").as[String] == "true") {
      REQUEST_TOKEN  = (response.json \ "oauth_token").as[String]
      REQUEST_SECRET = (response.json \ "oauth_token_secret").as[String]
      requestDone.success(true)
    }
  }
})

好的,所以我已经开始工作了(没有 oauth_callback 参数,因为如果我添加它,我会再次收到错误)。 我得到了 Request_token,这是有效的,因为当我在浏览器中手动粘贴身份验证 url 以及生成的请求令牌时,我被重定向到 twitter 身份验证页面,然后进行了正确的回调,结果也是正确的。 (token、token_secret、user_id 和 screen_name)

但我的代码似乎忽略了我重定向到此授权页面的操作。

requestToken_future.map { result =>
      Redirect("https://api.twitter.com/oauth/authenticate?oauth_token="+REQUEST_TOKEN)
    }

如果我将 Logger 放在括号内,它会在我的终端窗口中显示日志。但是该重定向似乎只是被忽略了。永不熄灭。

【问题讨论】:

    标签: scala twitter oauth twitter-oauth


    【解决方案1】:

    您没有包含必需的 oauth_callback 参数。请参阅文档here

    【讨论】:

    • 我让它工作了。我对导致错误的签名进行 URLEncoded。
    • 但是现在当我进入下一步,即“将用户重定向到 Twitter 身份验证”时,什么也没有发生。我在重定向之前拥有所有正确的东西,但实际的重定向永远不会发生。我尝试像你说的那样添加 oauth_callback 参数,但这让我回到了“无法验证 oauth 签名和令牌”的问题。
    • 我不确定您所说的“重定向永远不会关闭”是什么意思。您必须使用请求令牌作为查询字符串将用户自己重定向到 Twitter oauth/authorize 端点。当您计算签名以及授权标头时,您是否还在参数字符串中包含了 oauth_callback 参数?
    • 我已经完成了所有工作,但只有当我在浏览器中手动粘贴 api.twitter.com/oauth/… 时。我将编辑我的问题,以便您了解我的意思。
    猜你喜欢
    • 2011-04-08
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多