AWS Cognito oauth2/token 端点中的 405 方法不允许错误
Posted
技术标签:
【中文标题】AWS Cognito oauth2/token 端点中的 405 方法不允许错误【英文标题】:405 method not allowed error in AWS Cognito oauth2/token endpoint 【发布时间】:2019-09-12 00:23:24 【问题描述】:我正在使用 AWS Cognito UI 使用授权代码授予流程登录并成功获取授权代码。但是当通过 postman 向 oauth2/token 端点发出 post 请求时出现 405 method not allowed 错误
应用程序客户端设置在 Cognito 用户池中,应用程序密钥通过 appclientid:appclientsecret 作为 base64 编码的授权。
【问题讨论】:
【参考方案1】:如文档中所述:
内容类型 必须始终为“application/x-www-form-urlencoded”。
来源:https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html
【讨论】:
【参考方案2】:使用 BasicAuth 的 Authentication 并提供Username
=client_id
, Password
=client_secret
使用POST
方法
使用Body
= x-www-form-urlencoded
不要忘记在 Body 中也使用 State
值。
【讨论】:
【参考方案3】:我遇到了类似的问题。就我而言,我必须将 Accept 标头更改为 */*
。
当我将其命名为 Accept=text/html,application/xhtml+xml,application/xml
时,它以 405 响应 /token 端点。希望这对某人有所帮助。
【讨论】:
【参考方案4】:我在 c# 中为授权类型的令牌编写代码,所有调用都以 405 Method Not Allowed 状态失败。
根据 AWS 文档,应使用以下 URL 和参数
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id=djc98u3jiedmi283eu928&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect
花了 2 个小时后,我发现从 URL 中删除 & 可以解决问题,所以请确保您的请求看起来像这样
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token
Content-Type='application/x-www-form-urlencoded'
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id=djc98u3jiedmi283eu928&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect
【讨论】:
【参考方案5】:我通过使我的代码如下所述解决了 AWS Cognito oauth2/token
端点中的此错误 405 方法不允许错误,并且它运行良好。
我从这个链接中获得了帮助,并使用正确的格式在 fetch 请求中提到了 header 和 body 参数:
https://formcarry.com/documentation/fetch-api-example
const requestOptions =
method: "POST",
headers:
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": `Basic $authData`,
"Accept": "application/json"
,
body: `grant_type=$config.grant_type&code=$code&client_id=$config.clientId&redirect_uri=$config.loginRedirectUri`
fetch(`$config.domainUrl/oauth2/token`, requestOptions)
.then(response => response.json())
.then(data =>
sessionStorage.setItem("access_token",data.access_token)
fetchUserDetails(data.access_token)
)
我使用配置文件来保存变量。
const config =
domainUrl: "https://domainname.auth.origin.amazoncognito.com",
clientId: "xxxxxxxxxxxx",
loginRedirectUri: "http://localhost:8000/redirecturi",
grant_type: "authorization_code",
logoutUri: "http://localhost:8000",
clientSecret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
【讨论】:
【参考方案6】: var strClientSecret = $""your_clientId":"your_clientsecret"";
var client = new HttpClient();
var body = new Dictionary<string, string>();
body.Add("grant_type", "client_credentials");
body.Add("client_id", "your_appclientid");
body.Add("redirect_uri", "your_callbackurl");
var content = new FormUrlEncodedContent(body);
var autho = System.Text.Encoding.UTF8.GetBytes(strClientSecret);
var base64Autho = System.Convert.ToBase64String(autho);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Autho);
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
var response = await client.PostAsync("https://your_domain.auth.ap-south-1.amazoncognito.com/oauth2/token", content);
【讨论】:
【参考方案7】:好吧,以防万一它对任何人有帮助。
在尝试检索相应的邮件时,我在 Postman 中遇到了 405 jwt 令牌(id_token、access_token、refresh_token)使用 grant_type 作为授权码。
原因是我使用 'application/x-www-form-urlencoded'
作为 Content-Type
的值的标题部分,即使用单引号。因此,当我删除这些单引号并立即使用 application/x-www-form-urlencoded
时,它就开始工作了。
【讨论】:
以上是关于AWS Cognito oauth2/token 端点中的 405 方法不允许错误的主要内容,如果未能解决你的问题,请参考以下文章
来自客户端 javascript 的错误 400 Cognito /oauth2/token 端点
text [使用CLI注册Cognito用户] #aws #cognito#aws-cli
AWS Cognito - 使用 JWT 与 cognito.getUser 开发工具包验证令牌