Использование passport.js в REST API - PullRequest
0 голосов
/ 02 ноября 2019

В настоящее время я создаю 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})
...