Twitter OAuth request_token: 错误代码 32,无法验证
Twitter OAuth request_token: Error Code 32, could not authenticate
我正在尝试在我的 Game Maker 应用中使用 Twitter 通过 OAuth 向 Firebase 验证用户(Game Maker 不支持 SDK)。
通过 REST HTTP POST 请求(根据 https://developer.twitter.com/en/docs/basics/authentication/api-reference/request_token)这样做,但响应是 "Error 32, could not authenticate you."
我已经在 Firebase 和 Twitter 的开发人员控制台上设置了我的应用程序,并将 API key/secret 值复制到 Firebase 控制台。 Firebase 给了我一个 callback_url,我已将其列入 Twitter 应用程序的白名单。
我正在关注三足 OAuth 的 Twitter API 文档(这是第 1 步,POST request_token),并查看了无数其他资源。
在签名上,我 double-checked 使用在线编码器证明我的 HMAC-SHA1 编码是正确的,确实如此。
这是我的 HTTP 请求:
URL: https://api.twitter.com/oauth/request_token
方法:POST
Header:
Host : api.twitter.com,
Content-Type : application/x-www-form-urlencoded,
Authorization :
Oauth oauth_callback="https%3A%2F%2Fbitblock-blast.firebaseapp.com%2F__%2Fauth%2Fhandler", oauth_consumer_key="kEH9VascQh5rGdq6khl0oCfnL", oauth_nonce="p0B7y4w0P334qa633JzF370z89LK0N60", oauth_signature="MTIwMjc1Nzc1MTczODQ1OTUxMzQyMzgxMzIxNzYxODQxMjQyMzkyNTEyMDI3MTI0MjM1", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1571857067", oauth_version="1.0"
Body: ""
header 的签名是从此字典生成的:
oauth_callback : https://bitblock-blast.firebaseapp.com/__/auth/handler,
oauth_consumer_key : [TWITTER API KEY],
oauth_nonce : [NONCE],
oauth_signature_method : "HMAC-SHA1",
oauth_timestamp" : [TIMESTAMP],
oauth_version" : "1.0"
(所有值由各自的脚本填写)
这就是我创建最终签名字符串的方式:
var parameters = map_to_http_parameter_string(header); //Convert to "key=value, key=value" format
var signature_base = string_upper(method) + "&" + percent_encode(url) + "&" + percent_encode(parameters);
var signing_key = [TWITTER_API_SECRET] + "&";
var signature = base64_encode(string_hex_to_binary(hash_hmac(signature_base, signing_key)));
这是签名创建的 step-by-step 分解:
串联 'parameters' 字符串:
"oauth_callback=https%3A%2F%2Fbitblock-blast.firebaseapp.com%2F__%2Fauth%2Fhandler&oauth_consumer_key=[API_KEY]&oauth_nonce=5sR6w60Hz2Uvk10EdW5135O79NuV3y7b&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1571857990&oauth_version=1.0"
(如您所见,这些是有序的 percent-encoded)
串联 'base signature' 字符串:
"POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttps%253A%252F%252Fbitblock-blast.firebaseapp.com%252F__%252Fauth%252Fhandler%26oauth_consumer_key%3D[API_key]%26oauth_nonce%3D5sR6w60Hz2Uvk10EdW5135O79NuV3y7b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1571857990%26oauth_version%3D1.0"
签名密钥“[TWITTER_API_SECRET]&”(访问密码留空)
运行 HMAC-SHA1 on (base signature, signing key),编码为base64(hex-to-binary部分是必要的,因为Game Maker中的HMAC-SHA1生成一个十六进制ASCII 字符串)
最后,我将该签名添加到 header 的身份验证值并发送我的 HTTP 请求。
响应应该是一个 OAuth 令牌,但我一直收到错误 32,无法对您进行身份验证。
我已经检查了所有内容以查看我做错了什么但找不到。
好吧,我发现这是一个愚蠢的错字:我在授权 header 中写了 "Oauth oauth_callback..." 而不是 "OAuth oauth_callback..."。
我正在尝试在我的 Game Maker 应用中使用 Twitter 通过 OAuth 向 Firebase 验证用户(Game Maker 不支持 SDK)。
通过 REST HTTP POST 请求(根据 https://developer.twitter.com/en/docs/basics/authentication/api-reference/request_token)这样做,但响应是 "Error 32, could not authenticate you."
我已经在 Firebase 和 Twitter 的开发人员控制台上设置了我的应用程序,并将 API key/secret 值复制到 Firebase 控制台。 Firebase 给了我一个 callback_url,我已将其列入 Twitter 应用程序的白名单。
我正在关注三足 OAuth 的 Twitter API 文档(这是第 1 步,POST request_token),并查看了无数其他资源。
在签名上,我 double-checked 使用在线编码器证明我的 HMAC-SHA1 编码是正确的,确实如此。
这是我的 HTTP 请求:
URL: https://api.twitter.com/oauth/request_token 方法:POST Header:
Host : api.twitter.com,
Content-Type : application/x-www-form-urlencoded,
Authorization :
Oauth oauth_callback="https%3A%2F%2Fbitblock-blast.firebaseapp.com%2F__%2Fauth%2Fhandler", oauth_consumer_key="kEH9VascQh5rGdq6khl0oCfnL", oauth_nonce="p0B7y4w0P334qa633JzF370z89LK0N60", oauth_signature="MTIwMjc1Nzc1MTczODQ1OTUxMzQyMzgxMzIxNzYxODQxMjQyMzkyNTEyMDI3MTI0MjM1", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1571857067", oauth_version="1.0"
Body: ""
header 的签名是从此字典生成的:
oauth_callback : https://bitblock-blast.firebaseapp.com/__/auth/handler,
oauth_consumer_key : [TWITTER API KEY],
oauth_nonce : [NONCE],
oauth_signature_method : "HMAC-SHA1",
oauth_timestamp" : [TIMESTAMP],
oauth_version" : "1.0"
(所有值由各自的脚本填写)
这就是我创建最终签名字符串的方式:
var parameters = map_to_http_parameter_string(header); //Convert to "key=value, key=value" format
var signature_base = string_upper(method) + "&" + percent_encode(url) + "&" + percent_encode(parameters);
var signing_key = [TWITTER_API_SECRET] + "&";
var signature = base64_encode(string_hex_to_binary(hash_hmac(signature_base, signing_key)));
这是签名创建的 step-by-step 分解:
串联 'parameters' 字符串: "oauth_callback=https%3A%2F%2Fbitblock-blast.firebaseapp.com%2F__%2Fauth%2Fhandler&oauth_consumer_key=[API_KEY]&oauth_nonce=5sR6w60Hz2Uvk10EdW5135O79NuV3y7b&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1571857990&oauth_version=1.0" (如您所见,这些是有序的 percent-encoded)
串联 'base signature' 字符串: "POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttps%253A%252F%252Fbitblock-blast.firebaseapp.com%252F__%252Fauth%252Fhandler%26oauth_consumer_key%3D[API_key]%26oauth_nonce%3D5sR6w60Hz2Uvk10EdW5135O79NuV3y7b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1571857990%26oauth_version%3D1.0"
签名密钥“[TWITTER_API_SECRET]&”(访问密码留空)
运行 HMAC-SHA1 on (base signature, signing key),编码为base64(hex-to-binary部分是必要的,因为Game Maker中的HMAC-SHA1生成一个十六进制ASCII 字符串)
最后,我将该签名添加到 header 的身份验证值并发送我的 HTTP 请求。
响应应该是一个 OAuth 令牌,但我一直收到错误 32,无法对您进行身份验证。
我已经检查了所有内容以查看我做错了什么但找不到。
好吧,我发现这是一个愚蠢的错字:我在授权 header 中写了 "Oauth oauth_callback..." 而不是 "OAuth oauth_callback..."。