Как использовать Google oAuth с бэкендом Node.js и угловым интерфейсом? - PullRequest
0 голосов
/ 05 ноября 2018

Я использую Node.js в бэкэнде и создаю токен для пользователя каждый раз при входе в систему. Пакет angularx-social-login позволяет легко интегрировать Google OAuth с Angular, но как использовать его с API? После успешного входа в систему Google возвращает информацию о пользователе с токеном. Я думал отправить эту информацию бэкэнду и войти в систему пользователя, но для этого мне нужно создать маршрут, который принимает адрес электронной почты и логин пользователя. И это вернет токен JWT, который не является безопасным. Под безопасностью я имею в виду, что любой может получить доступ к маршруту без аутентификации Google и создать токен.

Я ищу идеи, как разработчики достигли этого.

1 Ответ

0 голосов
/ 06 ноября 2018

Я нашел google-auth-library клиентский пакет для Node.js, управляемый Google.

Вот следующее:

  1. Логин пользователя с Angular
  2. Отправить idToken на сервер
  3. Проверка токена и ответ на Angular

Node.js:

exports.googleLogin = function(req, res, next) {
  //verify the token using google client
  return googleClient
    .verifyIdToken({
      idToken: req.body.token,
      audience: config.google.clientID
    })
    .then(login => {
      //if verification is ok, google returns a jwt
      var payload = login.getPayload();
      var userid = payload['sub'];

      //check if the jwt is issued for our client
      var audience = payload.aud;
      if (audience !== config.google.clientID) {
        throw new Error(
          'error while authenticating google user: audience mismatch: wanted [' +
            config.google.clientID +
            '] but was [' +
            audience +
            ']'
        );
      }
      //promise the creation of a user
      return {
        name: payload['name'], //profile name
        pic: payload['picture'], //profile pic
        id: payload['sub'], //google id
        email_verified: payload['email_verified'],
        email: payload['email']
      };
    })
    .then(user => {
      return res.status(200).json(user);
    })
    .catch(err => {
      //throw an error if something gos wrong
      throw new Error(
        'error while authenticating google user: ' + JSON.stringify(err)
      );
    });
};
...