【发布时间】:2019-03-06 16:04:00
【问题描述】:
您好,我的护照代码有误:
The code passed is incorrect or expired.
500
TokenError: The code passed is incorrect or expired.
at Strategy.OAuth2Strategy.parseErrorResponse (/usr/app/node_modules/passport-oauth2/lib/strategy.js:329:12)
at Strategy.OAuth2Strategy._createOAuthError (/usr/app/node_modules/passport-oauth2/lib/strategy.js:376:16)
at /usr/app/node_modules/passport-oauth2/lib/strategy.js:166:45
at /usr/app/node_modules/passport-github/lib/strategy.js:77:16
at /usr/app/node_modules/oauth/lib/oauth2.js:209:7
at passBackControl (/usr/app/node_modules/oauth/lib/oauth2.js:134:9)
at IncomingMessage.<anonymous> (/usr/app/node_modules/oauth/lib/oauth2.js:157:7)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickCallback (internal/process/next_tick.js:181:9)
我在除我的计算机之外的所有计算机上都有这个问题,所以我猜有一个令牌链接到我的计算机,但没有链接到其他计算机。
这个问题出现在 twitter 护照认证上
我的策略:
const passport = require('passport')
const TwitterStrategy = require('passport-twitter').Strategy;
const User = require('../models/User');
const keys = require('../config/keys')
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id).then((user) => {
done(null, user);
});
});
passport.use(new TwitterStrategy({
consumerKey: keys.twitter.consumerKey,
consumerSecret: keys.twitter.consumerSecret,
callbackURL: "http://localhost:8080/auth/twitter/callback"
},
function(accessToken, refreshToken, profile, done) {
User.findOne({userid: profile.id}).then((currentUser) => {
if(currentUser){
done(null, currentUser);
} else {
new User({
userid: profile.id,
name: profile.displayName
}).save().then((newUser) => {
console.log('created new user: ', newUser);
done(null, newUser);
});
}
});
}));
module.exports = passport;
我的路线:
const express = require('express');
const router = express.Router();
const passportTwitter = require('../auth/twitter');
const User = require('../models/User');
/* LOGIN ROUTER */
router.get('/login', function(req, res, next) {
res.render('login', { title: 'Please Sign In with:' });
});
/* LOGOUT ROUTER */
router.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
/* TWITTER ROUTER */
router.get('/twitter',
passportTwitter.authenticate('twitter'));
router.get('/twitter/callback',
passportTwitter.authenticate('twitter', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/users');
});
module.exports = router;
我知道这个错误很常见,但我已经从 stackoverflow 到 github 修复了 3 天,但我没有继续前进。因此,如果您有解决方案,我将非常感激。
如果你想自己尝试,我做了一个github:https://github.com/SPierre-Eloy/Passport_twitter_api/tree/master
编辑:我将用于隔离问题的代码简化为单一策略,即 twitter。
【问题讨论】:
-
你能把问题隔离成一个更简单的例子吗?如果您发布了一个失败策略的示例,我们将能够为您提供更好的帮助。此外,包括所有文件。现在对 mounts 有歧义:Google 策略获取
/auth/github/callback回调 url,但代码仅注册/github/callback。仅显示 Github 策略配置(复制粘贴两次)。 -
我隔离了 twitter 策略,它返回相同的错误。如果你想克隆我做了一个 github 的文件。 github.com/SPierre-Eloy/Passport_twitter_api/tree/master
-
你知道吗,我试过你的代码。我注释掉了mongo部分,认证工作正常!
-
成功了,非常感谢。
标签: javascript node.js express passport.js passport-twitter