Как пройти аутентификацию по моим конечным точкам с помощью паспорта? - PullRequest
0 голосов
/ 25 марта 2019

Я настроил стратегию паспорта spotify с помощью dong Монго для сохранения профиля пользователя, доступа и обновления токенов.Но кроме первоначального маршрута авторизации и URL-адреса обратного вызова, нужно ли передавать passport.authenticate в качестве обратного вызова на каждый маршрут?Или я должен иметь специальное промежуточное программное обеспечение, которое проверяет, есть ли в модуле cookie-сессии req.user по запросу?Я вижу это как две возможности.Какой правильный?Я знаю, что на стороне куки он в конце концов истечет, и маршрут / auth нужно будет вызывать снова.

Я сделал функцию промежуточного программного обеспечения, которая проверяет пользовательское свойство объекта запроса.Но я не уверен, как это проверить.Возможно, сокращение срока действия куки и проверка req.user ложно.

passport.serializeUser((user, done) => {
    done(null, user.id);
});

passport.deserializeUser((id, done) => {
    User.findById(id)
        .then((user) => {
            done(null, user);
        });
});

passport.use(new SpotifyStrategy({
    clientID: keys.spotifyClientID,
    clientSecret: keys.spotifyClientSecret,
    callbackURL: '/auth/spotify/callback',
    proxy: true
}, async (accessToken, refreshToken, profile, done) => {

    const spotifyId = profile.id
    const name = profile.displayName
    const email = profile.emails[0].value

    const existingUser = await User.findOne({ spotifyId: profile.id });

    if (existingUser) {
        return done(null, existingUser);
    }

    const user = await new User({ spotifyId, name, accessToken, refreshToken}).save();

    done(null, user);
}));

Check the cookie middleware:

module.exports = isAuthenticated = (req, res, next) => {

if (req.user) {
    return next();
}

return res.redirect('/auth/spotify');
}
Example route:


module.exports = (app) => {

app.get('/api/spotify/playlists', passport.authenticate('spotify'), 
  (req, res) => {

console.log('got here')
console.log(req.user);

 //return playlists
});
 }

1 Ответ

1 голос
/ 27 марта 2019

Вы можете создать middleware, который будет проверять, является ли пользователь authenticated или нет, и добавить это middleware к вашему routes.

Паспорт запускается deserializeUser каждый раз, когда запросвызывается и сохраняет аутентифицированного пользователя в req.user.middleware проверит, существует ли req.user, и если он завершится, это означает, что пользователь logged in и authenticated, и запрос может быть разрешен для продолжения.

Вам не нужно использовать passport.authenticate('spotify') при каждом запросе он вам нужен только во время login (или registration).

Промежуточное программное обеспечение можно добавить следующим образом:

function isAuthenticated(req, res, next) {
    if (req.user) {
        next();
    } else {
        res.redirect('/login');
    }
}

app.get('/api/spotify/playlists', isAuthenticated, 
  (req, res) => {

console.log('got here')
console.log(req.user);

 //return playlists
});

Надеюсь, это сработаетдля вас.

...