如何解决当 url 具有查询参数时,GET 请求失败并显示 401 Unauthorized Error
我正在使用 Oauth 1.0a 在 C# 中对 Jira 进行 Rest API 调用。到目前为止,我已经能够获取访问令牌并使用此令牌进行 API 调用以获取项目、发布、创建票证和添加附件,而没有任何问题。
当我在 URL 中有一些查询参数时我遇到了一个问题,我收到了响应 oauth_problem="signature_invalid"
"{WWW-Authenticate: OAuth 领域="https%3A%2F%2Fxxxx-stage.dummy.com%2Fjira",OAuth 领域="https%3A%2F%2Fxxxx-stage.dummy.com%2Fjira",oauth_problem="signature_invalid",oauth_signature = “fxrHjNmz3C0gPClh667xKO93fU9PI%2FFAy2o%2B0tA98oso3d%2FiHF957LnMJdKWdmN1w6lJIgEYA5WLpvRuv65IIgAVeSWQWyyE2iqKY5NKpVe8w9lNKJpp6jVX3OzUfhZFsUmNcfwmrfEzDfq0DFKHbDltA9KX51daMWfE5bOxUwA%3D”, oauth_signature_base_string =“GET%26https%253A%252F%252Fxxxx-stage.dummy.com%252Fjira%252Frest%252Fapi%252F2%252Fissue%252Fcreatemeta%26oauth_callback%253Doob%2526oauth_consumer_key%253DOauthKey精英%2526oauth_nonce%253D161227630350881010%2526oauth_signature_method%253DRSA-SHA1 %2526oauth_timestamp%253D1612276303%2526oauth_token%253DIuXbcYTqh5kAIbirTWg7zqzJhVITFHny%2526oauth_version%253D1.0",oauth_signature_method="RSA-SHA1"
日期:2021 年 2 月 2 日星期二 14:34:19 GMT 严格运输安全:
最大年龄=16000000;包括子域;预加载 X-XSS-保护:
1;mode=block Referrer-Policy: strict-origin-when-cross-origin
X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN
内容安全策略:框架祖先“自我”
X-Permitted-Cross-Domain-Policies: none X-Download-Options: noopen
内容类型:application/x-www-form-urlencoded;字符集=UTF-8
内容长度:654 }
实际网址是“https://xxxx-stage.dummy.com/jira/rest/api/2/issue/createmeta?projectKeys=Elite&issueTypeNames=Task&expand=projects.issuetypes.fields”
在对 url 和参数进行排序和编码后,我得到了以下字符串,我使用 RSA-SHA1 对其进行签名。
GET&https%3A%2F%2Fxxxx-stage.dummy.com%2Fjira%2Frest%2Fapi%2F2%2Fissue%2Fcreatemeta&expand%3Dprojects.issuetypes.fields%26issueTypeNames%3DTask%26projectKeys%3DSciFiProject%26oauth%2Frest%2Fapi%2F2%2Fissue%2Fcreatemeta&expand% -elite%26oauth_nonce%3D161227476865431774%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1612274768%26oauth_token%xxxxcYTqh5k%3DRSA-SHA1%26oauth-
并且查询参数没有添加到授权头中。它只有 OAuth 参数。
另外,我注意到在编码的 URL 中,“GET”方法名称和 URL 用“&”分隔。第一个参数“expand”和 URL 的结尾“createmeta”由“&”分隔,但包括 OAuth 参数在内的其他参数是 URL 编码的。奇怪的是,这适用于没有查询参数的其他 URL。
这里已经回答了GET fails with 401 (Unauthorized) when query parameter is involved due to invalid OAuth signature,我已经尝试执行那里提到的步骤,但我想我可能会遗漏一些东西。
有人可以指导我哪里出错了吗?
解决方法
我能够自己找出问题所在。问题在于 SignatureBaseString 的形成方式。必须对参数进行排序,然后对其进行编码。所以就我而言,问题出在突出显示的参数上。
GET&https%3A%2F%2Fxxxx-stage.dummy.com%2Fjira%2Frest%2Fapi%2F2%2Fissue%2Fcreatemeta&expand%3Dprojects.issuetypes.fields%26issueTypeNames%3DTask%26projectKeys%3DSciFiProject %26oauth_callback%3Doob%26oauth_consumer_key%3DOauthKey精英%26oauth_nonce%3D161227476865431774%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1612274768%26oauth_token%xxxxcYTqh5kAIbirTWg7zqzJhVITFHny%26oauth_version%3D1.0
突出显示的参数应该位于编码字符串的末尾。所以基本上的解决方法是将参数按升序排序,用“&”分隔每个参数,然后对参数字符串进行URL编码。如果两个参数具有相同的名称,则根据它们的值对它们进行排序。
GET&https%3A%2F%2Fxxxx-stage.dummy.com%2Fjira%2Frest%2Fapi%2F2%2Fissue%2Fcreatemeta&expand%3Dprojects.issuetypes.fields%26issueTypeNames%3DTask%26oauth_callback%3Doob%26okey2%3Doob%26oauth%3Douce %3D161228695355767297%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1612286953%26oauth_token%3xcxccYTqh5kAIbirTWg7zqzJhVITFHny%26oauth_version%3D1.0%26的 projectKeys%3DElite 强>
可以在此处找到有关参数编码的更多信息。 https://oauth.net/core/1.0/#encoding_parameters
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。