Мы выполняем 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);
}
};