身份验证的OpenId问题

时间:2019-03-04 05:56:55

标签: amazon-cognito

我对cognito有一个尴尬的问题。 我的身份验证策略适用于当前使用情况,但是当我尝试运行测试以注册新用户然后登录该网站以访问我的网站中其他API时,

const authenticationData = {
    Username: req.body.email,
    Password: req.body.password,
  };
  const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
  const poolData = {
    UserPoolId: config.development.UserPoolId,
    ClientId: config.development.ClientId,
    TokenScopesArray : config.development.TokenScopesArray
  };
  const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
  const userData = {
    Username: req.body.email,
    Pool: userPool,
    TokenScopesArray : config.development.TokenScopesArray
  };
  const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
  cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result) {
      console.log('success')
      token = result.getAccessToken().jwtToken;
      const idToken = result.idToken.jwtToken;
      console.log(token)
      res.cookie("accessToken",token)
      res.status(200).send(token);
    },

    onFailure: function (err) {
      console.log(err)
      res.status(404).send(err)
    },`

然后,当我尝试使用以下代码进行身份验证时:

app.use(function (req, res, next) {
  var token = req.body.token || req.query.token || req.cookies.accessToken || req.headers['x-access-token'];
  try {
    if (token) {
      let promise = new Promise((resolve, reject) => {
        const data = null;
        const xhr = new XMLHttpRequest();
        xhr.withCredentials = true;

        xhr.addEventListener("readystatechange", function () {
          if (this.readyState === 4) {
            console.log('response', this.responseText);
          }
        })

        xhr.open("GET", "https://gridmanager.auth.us-east-1.amazoncognito.com/oauth2/userInfo");
        xhr.setRequestHeader("Authorization", "Bearer " + token);
        xhr.setRequestHeader("cache-control", "no-cache");
        xhr.setRequestHeader("TokenScopesArray", config.development.TokenScopesArray)
        xhr.send(data);
        resolve(xhr.responseText)
      })
        .then(function (response) {
          if (response != null) {
            res.decoded = response
            next();
          }
          else {
            return res.status(404).send('User not authenticated')
          }
        })
    }
    else {
      console.log('No token')
      return res.status(403).send('No token')
    }
  } catch (error) {
    // if there is no token
    // return an error
    console.log('error')
    return res.status(403).send({
      success: false,
      message: error.message
    });
  }

我在xhr.responseText中收到以下错误: {“错误”:“ invalid_token”,“错误说明”:“访问令牌不包含openid范围”} 当我登录accessToken时,我登录功能中只有'aws.cognito.signin.user.admin' 我已经尝试在我的appclient中更改设置,但是没有任何效果 谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

不幸的是,只有Cognito托管UI发出的访问令牌可以包含aws.cognito.signin.user.admin以外的范围。 Cognito托管的UI支持OpenId Connect,而Cognito API不支持。就这两个提供的功能而言,这是一个很大的差距。 / oauth2 / userInfo终结点是Hosted UI的一部分,它也遵循OpenID Connect规范。

为什么在访问id_token时为什么要呼叫/oauth2/userInfo端点? id_token有效负载具有/oauth2/userInfo将返回的有关用户的所有信息。