В настоящее время я создаю API-интерфейс REST, который должен позволять пользователям аутентифицировать себя как с помощью имени пользователя + пароля, так и своей учетной записи Google.
Требуемая система состоит в том, что пользователь входит в систему одним из вышеупомянутых методов. и взамен они получают ключ API. Этот ключ API может затем использоваться для доступа к конечным точкам в API. Я не хочу использовать куки.
Как я могу добиться такого поведения? В настоящее время я использую passport-google-oauth20
, и все работает нормально, за исключением того, что я понятия не имею, как настроить поведение passport.js для возврата ключа API.
Чтобы дать вам некоторое представление о моем текущем коде,вот соответствующие части:
Это устанавливает стратегию Google:
const options: Google.StrategyOptions = {
clientID: 'my client ID',
clientSecret: 'my client secret',
callbackURL: `/foo/redirect`,
scope: ['profile', 'email']
};
const callback: Callback = (accessToken, refreshToken, profile, done) => {
UserManager.getFromGoogleID(profile.id)
.then(user => {
done(undefined, user);
})
.catch(e => {
done(e);
});
};
const strategy = new Google.Strategy(options, callback);
passport.use(strategy);
И это (де) сериализует пользователей (код здесь в основном пользовательская логика, но яв основном сериализацию пользователей путем выдачи их идентификатора базы данных и десериализации их путем извлечения пользователя с определенным идентификатором):
passport.serializeUser<User, User.ID>((user, done) => {
const id = user.getId();
done(undefined, id);
});
passport.deserializeUser((id, done) => {
try {
done(undefined, UserManager.get(id as number));
} catch (error) {
done(ServerUtils.makeRESTableError(error).asRESTError());
}
});
Наконец, я аутентифицирую пользователей вот так (возвращаемое значение этой функции используется какпромежуточное программное обеспечение в экспресс-маршруте):
passport.authenticate('google', {session: false})