javascript - 不同的重定向视情况而定 Discord Passport 策略
问题描述
我对使用 Passport 有点陌生,但我想知道是否可以根据情况更改登录将您重定向到不同位置的位置。由于我无法访问策略文件中的 res/req 变量,我想知道是否有人对如何执行此操作有任何建议。
例如
正常登录
- 用户点击授权(重定向到)->
./profile
新用户登录
- 用户点击授权(重定向到)->
./new-user
这是我现在的路由器:
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)
}
}));
我知道它很乱,但它有效
如果有人可以帮助我实现这一目标,请告诉我!
解决方案
推荐阅读
- c# - 显示日期时间查询中的日期格式
- python - 我需要一个由调用组成的列表,例如 os.system('ls' + path)
- docker - 无法在 Azure 容器实例中进行 DNS 查找 - Windows 容器
- julia - 如何绘制混合整数问题结果?
- regex - 如何为 .htaccess 编写 RewriteRules?
- python - Mongodb如何更新许多并设置特定于id的配置文件
- python - sklearn中的logloss和Pytorch中的BCEloss之间的区别?
- python - 将 PCA 应用于一个样本
- php - 如何从mysql数据库中提取while循环中的数组值
- c# - 在 IIS Express,VS 2017 中运行网站时出现未处理的访问异常