gpt4 book ai didi

android - Twitter API 401 的 on/account/verify_credentials

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:03 27 4
gpt4 key购买 nike

我正在尝试使用 twitter api,并且正在设置一个处理程序来处理 twitter api 请求。

为此,我使用 HTTPUrlConnection 并遵循 Twitter api 文档

我已经成功地使用 3-legged OAuth 流程获得了身份验证,但在实际尝试使用 oauth token 发出请求时卡住了。

这是我的身份验证 header 的示例:

Accept=*/*, 
Connection=close,
User-Agent=OAuth gem v0.4.4,
Content-Type=application/x-www-form-urlencoded,
Authorization=
OAuth oauth_consumer_key=****&
oauth_nonce=bbmthpoiuq&
oauth_signature=*****%3D&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1570586135&
oauth_token=*****&
oauth_version=1.0,
Host=api.twitter.com

对于 auth header 中的每个 header ,我将其添加到我的 HTTP GET 调用中,如下所示:

urlConnection.setRequestProperty(header.key, header.value)

注意Authorization指向一个字符串

OAuth oauth_consumer_key=****&oauth_nonce=bbmthpoiuq&oauth_signature=*****%3Doauth_signature_method=HMAC-SHA1oauth_timestamp=1570586135&oauth_token=*****&oauth_version=1.0,Host=api.twitter.com

以下参数收集如下:

  • oauth_consumer_key 是我的应用程序 API key

  • oauth_signature 由下面的hmacSign 函数计算

  • oauth_token 是从 /oauth/access_token

  • 的响应中收到的“oauth_token”

hmacSign 函数:

    private fun hmacSign(requestType: RequestType, url: String, params: Map<String, String>): String {
val type = "HmacSHA1"
val key = "$API_SECRET&$tokenSecret"
val value = makeURLSafe("${requestType.string}&$url${getURLString(params.toList().sortedBy { it.first }.toMap())}")

val mac = javax.crypto.Mac.getInstance(type)
val secret = javax.crypto.spec.SecretKeySpec(key.toByteArray(), type)
mac.init(secret)
val digest = mac.doFinal(value.toByteArray())

return makeURLSafe(Base64.encodeToString(digest, NO_WRAP))
}

private fun makeURLSafe(url: String) : String {
return url.replace("/", "%2F")
.replace(",", "%2C")
.replace("=", "%3D")
.replace(":", "%3A")
.replace(" ", "%2520")
}

protected fun getURLString(params: Map<String, Any>) : String {
if (params.isEmpty()) return ""

return params.toList().fold("?") { total, current ->
var updated = total

updated += if (total == "?")
"${current.first}=${current.second}"
else
"&${current.first}=${current.second}"

updated
}
}

在我提到的 GET 调用中,tokenSecret 将是从 /oauth/access_token 接收的 oauth secret

在我调用电话后,我收到一个 400: Bad Request

有什么明显的我做错了吗?


更新:通过将参数放在 url 的末尾,例如 ?key=value&key2=value2... 而不是 400,我得到 401。所以我不确定哪个更糟,或者这是正确的方法。

最佳答案

好吧,终于搞定了

所以根据评论中的建议,我下载了 postman 并将我的所有信息复制到 postman 中 - 当我在那里提出请求时,我得到了 200!

然后我回头看,试图弄清楚有什么不同,有几件事:

首先,hmac sign 函数缺少一个 &

新功能(在url后添加了另一个&):

    private fun hmacSign(requestType: RequestType, url: String, params: Map<String, String>): String {
val type = "HmacSHA1"
val key = "$API_SECRET&$tokenSecret"
val value = makeURLSafe("${requestType.string}&$url&${getURLString(params.toList().sortedBy { it.first }.toMap())}")

val mac = javax.crypto.Mac.getInstance(type)
val secret = javax.crypto.spec.SecretKeySpec(key.toByteArray(), type)
mac.init(secret)
val digest = mac.doFinal(value.toByteArray())

return makeURLSafe(Base64.encodeToString(digest, NO_WRAP))
}

接下来我注意到我的 auth header 的参数用 & 分隔,但它们都应该被替换为 , - 我还需要将我的每个值包围在“”

所以它看起来像:

OAuth oauth_consumer_key="****",oauth_nonce="bbmthpoiuq",oauth_signature="*****%3D",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1570586135",oauth_token="*****",oauth_version="1.0",Host="api.twitter.com"

在这些改变之后我开始获得 200!

希望这对其他人有帮助(尽管考虑到这些问题的具体程度,我确信这不太可能)

关于android - Twitter API 401 的 on/account/verify_credentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58296679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com