AWS Cognito oauth2 /令牌终端节点中的405方法不允许错误

时间:2019-04-22 20:25:11

标签: amazon-web-services oauth-2.0 amazon-cognito

我正在使用AWS Cognito UI通过授权码授予流程进行登录,并成功获取了授权码。但是通过邮递员向oauth2 / token端点发出发布请求时,出现 405方法不允许错误

已在Cognito用户池中设置了应用程序客户端,并以base64编码的身份通过appclientid:appclientsecret传递了应用程序秘密。

7 个答案:

答案 0 :(得分:1)

使用身份验证的BasicAuth并提供Username = client_idPassword = client_secret

使用POST方法

使用Body = x-www-form-urlencoded

也不要忘记在正文中使用State值。

答案 1 :(得分:0)

我有类似的问题。就我而言,我不得不将Accept标头更改为*/*

当我将其设为Accept=text/html,application/xhtml+xml,application/xml时,它以405响应/ token端点。希望能对某人有所帮助。

答案 2 :(得分:0)

如文档中所述:

  

内容类型   必须始终为“ application / x-www-form-urlencoded”。

来源:https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

答案 3 :(得分:0)

我正在用C#编写具有Authorization_code授予类型的令牌的代码,并且所有调用均以 405不允许的方法状态失败。

根据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

答案 4 :(得分:0)

        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);

答案 5 :(得分:0)

好吧,以防万一它对任何人都有帮助。

在尝试检索相应的邮件时,我在邮递员中遇到405 jwt令牌(id_token,access_token,refresh_token)使用 grant_type作为授权码。

原因是标题部分,我在其中使用'application/x-www-form-urlencoded'作为Content-Type的值,即使用单引号。因此,当我删除这些单引号并立即使用application/x-www-form-urlencoded时,它就开始工作。

答案 6 :(得分:0)

我通过使我的代码如下所述解决了 AWS Cognito oauth2/token 端点中的此错误 405 方法不允许错误,并且它运行良好。 我从这个链接中获得帮助,并使用正确的格式在获取请求中提及标头和正文参数:

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"
}