Как я могу использовать passport.js, чтобы ПОЛУЧИТЬ JSON, используя accessToken уже вошедшего в систему пользователя? - PullRequest
0 голосов
/ 24 августа 2018

Я могу выполнить запрос GET, чтобы получить JSON с разногласий при использовании токена доступа, предоставленного по паспорту.Как я могу использовать аттестат, чтобы получить доступ к авторизованному пользователю для выполнения запросов GET на другой странице?

passport.use(new DiscordStrategy({
    clientID: keys.discord.clientID,
    clientSecret: keys.discord.clientSecret,
    callbackURL: '/auth/discord/redirect'
}, (accessToken, refreshToken, profile, done) => {
    request({
        url: 'https://discordapp.com/api/users/@me/guilds',
        auth: {
            'bearer': accessToken
        }
    }, (err, res) => {
        console.log(res.body);
    });

    User.findOne({ discordId: profile.id }).then((currentUser) => {
        if (currentUser) {
            done(null, currentUser);
        } else {
            new User({
                discordId: profile.id
            }).save().then((newUser) => {
                console.log('Created new user: ', newUser);
                done(null, newUser);
            });
        }
    });
}));

1 Ответ

0 голосов
/ 24 августа 2018

Поэтому я пропущу паспортную часть и покажу вам обмен токенов:

Метод входа:

const jwt = require('jsonwebtoken');
[...]
app.post('/signin', passport.authenticate('signin'), (req, res) => {
    if (req.user){
        // Set the JWT token for this session
        const token = jwt.sign(
            { id: req.user.id }, 
            keys.discord.clientSecret, 
            { expiresIn: config.SESSION_DURATION } //The validity time (optional)
        );

        const currentDate = new Date();
        return res.status(200).send({
            auth: true, 
            token: token,
            // These two properties below are optional if you want to keep track
            // of the session duration and send some more user info
            tokenDuration: { 
                expire: currentDate.setMilliseconds(currentDate.getMilliseconds() + config.SESSION_DURATION)},

            user: {firstname: req.user.firstname, lastname: req.user.lastname}
        });
    }

    return res.status(401).send('Could not login');
});

Тогда, когда вы делаете запросы от клиента:

axios({
    method: 'POST',
    url: `${url}/path`,
    data: data,
    headers: {
        'x-access-token': jwtToken, // This is the "token" property from above
    },
    json: true
})

И, наконец, вы обрабатываете вышеуказанный запрос на сервере:

app.post('/path', (req, res) => {
    jwt.verify(req.headers['x-access-token'], keys.discord.clientSecret, (err, decoded) => {
        if (err) {
            // The user is not authorized, handle properly
        }

        // User is authorized, do stuff
});

Надеюсь, этого будет достаточно для начала. Как я уже говорил, посмотрите на JWT, их документация хорошо написана:)

...