OAuth1 reject_token 401 未经授权
OAuth1 reject_token 401 unauthorized
从授权重定向回来后,OAuth1.0 的获取访问令牌请求仅对 Magento1.9 有效一次 URL。下次请求访问令牌时,我得到 reject_token。
我注意到两个对象的签名不同。
请求 1(成功):
OAuth::Consumer.new(consumer_data)
OAuth::RequestToken.from_hash(some_hash)
request_token.get_access_token(oauth_verifier: 'asdfasdagbadbv')
签名有
oauth_nonce=\"iIHmN7obLeONSitOxFFZQI71v0k4mAsEFLFen0Lw\",
oauth_signature=\"lwj0n1AK3VJLdaXHIWEOFlYp5qc%3D\"
请求2(未成功):
OAuth::Consumer.new(consumer_data)
OAuth::RequestToken.from_hash(some_hash)
request_token.get_access_token(oauth_verifier: 'asdfasdagbadbv')
签名有
oauth_nonce=\"KciY4tiiPDu1u029Nbdu1C325svchfESTYV1l8mvw\",
oauth_signature=\"KciY4tiiPt5Du1u029Nbdu1CzCHzvc%3D\"
这可能是也可能不是问题,但这是我目前在这两个请求中发现的唯一区别。
请有人帮助我更新 oauth_nonce
和 signature
或设计其他解决方案。
问题在第二行。
request_token.get_access_token(oauth_verifier: 'asdfasdfa')
根据 Auth 文档请求令牌应使用一次。一旦我们使用它们,请求令牌就会过期。您在第二次调用中使用了过期的请求令牌 ,这会导致 reject_token 401 未经授权。
解决方案
实际上,请求令牌用于生成访问令牌。访问令牌可以多次使用。所以你需要的是在某处存储访问令牌,在第一行 request_token.get_access_token(oauth_verifier: 'asdfasdfa')
中生成。然后您可以在 API 调用的重置中使用保存的访问令牌。使用访问令牌的语法如下:
@consumer = OAuth::Consumer.new(...)
@token = OAuth::Token.new('ACCESS_TOKEN', 'ACCESS_TOKEN_SECRET') // saved access token and secret here
@consumer.request(:post, '/people', @token, {}, @person.to_xml, { 'Content-Type' => 'application/xml' })
从授权重定向回来后,OAuth1.0 的获取访问令牌请求仅对 Magento1.9 有效一次 URL。下次请求访问令牌时,我得到 reject_token。 我注意到两个对象的签名不同。
请求 1(成功):
OAuth::Consumer.new(consumer_data)
OAuth::RequestToken.from_hash(some_hash)
request_token.get_access_token(oauth_verifier: 'asdfasdagbadbv')
签名有
oauth_nonce=\"iIHmN7obLeONSitOxFFZQI71v0k4mAsEFLFen0Lw\",
oauth_signature=\"lwj0n1AK3VJLdaXHIWEOFlYp5qc%3D\"
请求2(未成功):
OAuth::Consumer.new(consumer_data)
OAuth::RequestToken.from_hash(some_hash)
request_token.get_access_token(oauth_verifier: 'asdfasdagbadbv')
签名有
oauth_nonce=\"KciY4tiiPDu1u029Nbdu1C325svchfESTYV1l8mvw\",
oauth_signature=\"KciY4tiiPt5Du1u029Nbdu1CzCHzvc%3D\"
这可能是也可能不是问题,但这是我目前在这两个请求中发现的唯一区别。
请有人帮助我更新 oauth_nonce
和 signature
或设计其他解决方案。
问题在第二行。
request_token.get_access_token(oauth_verifier: 'asdfasdfa')
根据 Auth 文档请求令牌应使用一次。一旦我们使用它们,请求令牌就会过期。您在第二次调用中使用了过期的请求令牌 ,这会导致 reject_token 401 未经授权。
解决方案
实际上,请求令牌用于生成访问令牌。访问令牌可以多次使用。所以你需要的是在某处存储访问令牌,在第一行 request_token.get_access_token(oauth_verifier: 'asdfasdfa')
中生成。然后您可以在 API 调用的重置中使用保存的访问令牌。使用访问令牌的语法如下:
@consumer = OAuth::Consumer.new(...)
@token = OAuth::Token.new('ACCESS_TOKEN', 'ACCESS_TOKEN_SECRET') // saved access token and secret here
@consumer.request(:post, '/people', @token, {}, @person.to_xml, { 'Content-Type' => 'application/xml' })