【问题标题】:401 returned from API gateway using Cognito authorizer - no matter what is passed in使用 Cognito 授权方从 API 网关返回 401 - 无论传入什么
【发布时间】:2019-01-12 08:02:00
【问题描述】:

我让用户能够登录、注销、注册、重置密码——所有这些都在我的 React.js 代码中使用 AWS amplify。

在他们登录后,我想获取我的 API 网关,即使用 Authorization: UserCognito,然后转到一个 lambda 函数,我希望能够在该函数中提取传递给我的 API 的数据并返回他们的来自 dynamoDB 的信息及其个人资料信息(例如姓名、图片、电子邮件)。

当我获取 API 时,我得到 {"message":"Unauthorized"}

我这样调用 api:



     getProfileInfo(user.signInUserSession.idToken.jwtToken).then(user => {
                console.log(user);
              });

甚至尝试过这个:

```

let token = await Auth.currentCredentials();
      console.log(token);
      const options = {
        method: "POST",
        headers: {
          "content-type": "application/json",

          Authorization: token.sessionToken
        }
      };

      let res = GetProfileInfo(token.sessionToken);
      API.post("XXURL", "", options);

````

getProfileInfo 看起来像:


      const getProfileInfo = async user => {
      let url = XXXXXXXX
      console.log(user);
      const data = await fetch(url, {
        method: "POST",
        headers: {
          "content-type": "application/json",
          Authorization: user
        },
        mode: "cors"
      })
        .then(response => {
          console.log(response);
          return response.json();
        })
        .then(data => {
          return data;
        })
        .catch(error => {
          return error;
        });
      return data;

所以 - 我如何将我的用户信息从 AWS-amplify 传递到我的 API,在反应前端 - 这样它就可以授权他们,然后在我接受的地方运行我的 lambda 函数他们的用户信息并在我的 DynamoDB 中查找他们的个人资料?

我的 API 网关在设置我的授权方时将令牌分配给了 Authorization 的值。

另外,我为我的 API 设置了如下所示的模板映射:

```
    {
    "context" : {
        "sub" : "$context.authorizer.claims.sub",
        "email" : "$context.authorizer.claims.email"
    }
    }
```

但是除了 Unauthorized 之外什么都没有返回。那么我做错了什么?

【问题讨论】:

    标签: reactjs amazon-web-services authorization aws-amplify


    【解决方案1】:

    如果您的 user 中的 getProfileInfo() 中确实有有效的 JWT,请尝试使用

    headers: {
      ...
      Authorization: 'Bearer ' + user    
    }
    

    也许您还想验证您在jwt.io 等网站上是否拥有有效令牌

    【讨论】:

    • 将“Bearer”和“JWT”都添加到授权标头中也不起作用。 JWT.io 说我的 JWT 令牌无效。我通过两种方式得到它:user.signInUserSession.idToken.jwtTokenAuth.currentSession() 为什么它说它无效?登录的用户及其有效
    • 我们实际上是这样做的:currentSession = await Auth.currentSession(); 然后添加currentSession.getIdToken().getJwtToken() 以实际获取最新令牌。我想这也是你所做的。 JWT.io 不应该能够验证签名(除非你提供它),但你 @Zach 实际上是从令牌中获取信息还是它完全被破坏了? - 如果您从令牌中获取信息。尝试再次检查 API 网关,看看您使用的客户端和网关是否使用相同的 cognito 用户池..
    • 成功了。提供正确的令牌和"Bearer " + 是关键。太感谢了。这在任何地方都没有记录......他们根本没有说使用 Bearer 是必需的。非常感谢您的帮助
    • @Zach 我认为正确的令牌是来自 Auth.currentSession() 的 jwtToken。我偶尔会收到 401,{message: "Your token has expired}。
    猜你喜欢
    • 2018-11-19
    • 2020-04-23
    • 1970-01-01
    • 2019-11-18
    • 2019-02-01
    • 2016-12-24
    • 2014-10-22
    • 2019-12-12
    • 1970-01-01
    相关资源
    最近更新 更多