首页 > 解决方案 > 不同的重定向视情况而定 Discord Passport 策略

问题描述

我对使用 Passport 有点陌生,但我想知道是否可以根据情况更改登录将您重定向到不同位置的位置。由于我无法访问策略文件中的 res/req 变量,我想知道是否有人对如何执行此操作有任何建议。

例如

正常登录

新用户登录

这是我现在的路由器:

let express = require('express');
let router = express.Router();
const passport = require('passport');

router.get('/', passport.authenticate('discord'));


//Log out
router.get('/logout', ((req, res) => {
    req.logout();
    res.redirect('/')
}));

router.get('/redirect', passport.authenticate('discord', {
    failureRedirect: '/404',
}), ((req, res, next) => {
    console.log(req.ip + ' has logged in.')
    res.redirect('../profile')
}))



module.exports = router;

我的策略文件:

const DiscordStrategy = require('passport-discord').Strategy;
const passport = require('passport');
const User = require('../schemas/User.js');
const axios = require("axios");
const MongoClient = require('mongodb').MongoClient;
const noblox = require('noblox.js');
const { getCollectionFromBotData } = require('../database');



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

passport.deserializeUser(async (userID, done) => {
    let thisUser = await getCollectionFromBotData('userData').findOne({ userID })

    if (thisUser) {
        done(null, thisUser);
    }
})


passport.use(new DiscordStrategy({
    clientID: "Removed for privacy",
    clientSecret: "Removed for privacy",
    callbackURL: "/auth/redirect",
    scope: ['identify', 'guilds.join', 'email']
}, async (accessToken, refreshToken, profile, done) => {


    try {
        let user = await getCollectionFromBotData('userData').findOne( { userID: profile.id } )
        console.log(user);
        if (user) {
            console.log(`user exists`)
            let updateObj = {
                email: profile.email,
                userID: profile.id,
                discordAvatar: `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}`,
                discordUsername: profile.username,
                lastLoggedInAt: Date.now()
            }
            getCollectionFromBotData('userData').updateOne( { userID: profile.id }, {$set: updateObj })


            done(null, user);
        } else {
            console.log(`user doesnt exists`)

            User.email = profile.email;
            User.userID = profile.id;
            User.discordAvatar = `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}`
            User.discordUsername = profile.username;
            User.caffeinatedAccountCreatedAt = Date.now();
            User.discordVerified = true;
            User.lastLoggedInAt = Date.now();


            axios.post('http://localhost:8000/verifyUser', {}, {
                headers: {
                    userID: profile.id
                }
            })
                .then((response) => {
                    if (response.data.code === 500) {
                            axios.put('https://discord.com/api/v8/guilds/737058844676587662/members/' + profile.id, { access_token: accessToken, roles: ['787536777312731136', '787536978320031775', '787536296523989012', '737609790905253918']}, {
                                headers: {
                                    Authorization: 'Removed for privacy',
                                }
                            })
                                .catch(err => {
                                    if (err.data.code === 40007) {
                                        console.log('user is banned');
                                    }
                                })
                    }
                    axios.get(`https://api.blox.link/v1/user/${profile.id}`)
                        .then(async r => {
                            if (r.data.status === 'ok') {
                                User.robloxData.robloxAvatar = `https://www.roblox.com/headshot-thumbnail/image?userId=${r.data.primaryAccount}&width=420&height=420&format=png`
                                User.robloxData.robloxID = r.data.primaryAccount;
                                User.robloxLinked = true;
                                User.robloxData.robloxUsername = await noblox.getUsernameFromId(Number(r.data.primaryAccount))

                                getCollectionFromBotData('userData').insertOne(User)
                                    .then(res => {
                                        done(null, res.ops[0]);
                                    })
                                    .catch((err) => {
                                        console.log(err);
                                    });
                            } else {

                                getCollectionFromBotData('userData').insertOne(User)
                                    .then(res => {
                                        done(null, res.ops[0]);
                                    })
                                    .catch((err) => {
                                        console.log(err);
                                    });
                            }
                        })
                        .catch(err => {
                            console.log(err);
                        })

                })
                .catch(err => {
                   console.log(err);
                });
        }
    }
    catch (e) {
        console.log(e)
    }

}));

我知道它很乱,但它有效

如果有人可以帮助我实现这一目标,请告诉我!

标签: javascriptnode.jsexpresspassport.js

解决方案


推荐阅读