node.js - FacebookTokenError:此授权码已被使用 passport-js
问题描述
我已经log in with facebook
使用 passport.js 实现了。但有时每当我尝试登录时,它都会给我这个错误 -
FacebookTokenError: This authorisation code has been used
但事实是它太随意了。有时它工作得很好。有时会给出这个错误。我已经尝试过 SO 帖子中提供的所有解决方案。它们都不起作用。
我使用 react 作为我的前端和 node.js 作为后端。对于使用 express-session 的会话中间件。
这是我用来实现的代码log in with facebook
import passport from 'passport';
import { Strategy } from 'passport-facebook';
const { FACEBOOK_APP_ID, FACEBOOK_APP_SECRET, API_URL } = process.env;
export default (app) => {
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser((user, cb) => cb(null, user));
passport.deserializeUser((obj, cb) => cb(null, obj));
passport.use(new Strategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: `${API_URL}facebook/callback`,
profileFields: ['id', 'displayName', 'email', 'name', 'photos'],
passReqToCallback: true,
enableProof: true,
}, async (req, accessToken, refreshToken, profile, cb) => {
try {
const email = (profile.emails && profile.emails[0].value) || '';
const { displayName } = profile;
const users = await Users.findOrCreate({
where: { email },
defaults: { name: displayName },
}).catch((err) => {
console.log(err);
});
if (users.length) {
req.session.userId = users[0].get('id');
return cb(null, users[0]);
}
} catch (err) {
console.log('error during fb: ', err);
}
return cb('error in facebook');
}));
app.use('/facebook', passport.authenticate('facebook', { session: false, scope: ['public_profile', 'email'] }));
app.use('/facebook/callback', passport.authenticate('facebook', { session: false, failureRedirect: `${FRONTEND_HOST}` }), (_, res) => {
res.redirect(`${FRONTEND_HOST}`);
});
};
这是我得到的完整错误-
解决方案
我不确定您的代码的实际问题,但您需要使用:
app.get('/facebook', ...)
app.get('/facebook/callback', ...)
代替
app.use(...)
推荐阅读
- reactjs - 访问本地存储中的图像
- c# - 使用没有证书文件的 TLS 连接到 MariaDB
- python - MongoDB 副本集 - 连接时出现错误“提供节点名或服务名,或未知”
- node.js - 将数据从服务器(Node.js)发送到 GraphQL 服务器中的客户端(React 组件)
- sql - 从同一行获取非空日期的计数
- python - 使用开始和结束日期左连接
- arrays - 循环遍历数组并根据先前的循环条件设置标志
- python - 电报 API:如何通过电报联系并使用 python @TelethonUpdates 获取状态
- javascript - 单个页面中的多个反应应用程序并使它们保持同步
- python - 有没有更好的方法在 python 中编写嵌套的 if 语句?