Паспортная стратегия, когда OAuth делается front-end? - PullRequest
0 голосов
/ 25 мая 2019

Мы выполняем OAuth-рукопожатие на внешнем интерфейсе, используя Vue и vue-google-oauth2, следующим образом:

async handleGoogleLogin() {
  try {
    const googleUser = await this.$gAuth.signIn();

    const idToken = googleUser.getAuthResponse().id_token;

    const response = await axios.post('http://localhost:3000/api/auth/google', {
      provider: 'google',
      clientId: this.$googleAuthClientId,
      idToken: `${idToken}`,
    });

    console.log('jwt: ', response);
    // TODO get and store the token
    this.$router.push('/');
  } catch (error) {
    console.log('error is', error);
  }
},

Затем на стороне сервера мы установили Passport с помощью 'passport-Google-oauth20.Эта проблема в том, что я не уверен, как сделать так, чтобы паспорт принимал id_token, исходящий из внешнего интерфейса, без выполнения всего танца перенаправления?

На данный момент мы обошли Passport, реализовав его как таковой (кодиспользует Typescript):

async googleVerify(token: string, clientId: string) {
    const googleOAuth2Client = new OAuth2Client(clientId);

    const ticket = await googleOAuth2Client.verifyIdToken({
        idToken: token,
        audience: clientId,
    });
    return ticket.getPayload();
  }

async authenticateGoogle (req: Request, res: Response, next: NextFunction) {
    const token = req.body.idToken;
    const clientId = req.body.clientId;
    try {
        console.log('.....', token, clientId);
        const result = await this.googleVerify(token, clientId);
        // TODO create user if not existing
        //      return JWT
        res.json(result);
    } catch (error) {
        next(error);
    }
};
...