Проблема OpenId для аутентификации - PullRequest
0 голосов
/ 04 марта 2019

У меня смущающая проблема с 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: {"error": "invalid_token", "error_description": "Маркер доступа не содержит область действия openid"} И когда я регистрируюсьaccessToken, который я получаю в функции входа в систему, он имеет только «aws.cognito.signin.user.admin». Я уже пытался изменить настройки моего приложения, но ничего не работает. Спасибо за вашу помощь

1 Ответ

0 голосов
/ 12 марта 2019

К сожалению, только маркеры доступа, выпущенные размещенным пользовательским интерфейсом Cognito, могут включать области, отличные от aws.cognito.signin.user.admin.Пользовательский интерфейс Cognito поддерживает OpenId Connect, а Cognito API - нет.Это большой разрыв с точки зрения функциональности, предоставляемой этими двумя.Конечная точка / oauth2 / userInfo является частью размещенного пользовательского интерфейса и также соответствует спецификации OpenID Connect.

Почему вы хотите вызывать конечную точку /oauth2/userInfo, когда у вас есть доступ к id_token?Полезная нагрузка id_token содержит всю информацию о пользователе, которую вернет /oauth2/userInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...