NodeJS 内部OAuthError:无法获取访问令牌

7dl7o3gd  于 2023-02-15  发布在  Node.js
关注(0)|答案(7)|浏览(156)

有人能帮我解决链接GitHub oauth2-provider server与passport-oauth2 consumer中的以下代码的问题吗
在我使用http://localhost:8082登录并到达回拨URL后:http://localhost:8081/auth/provider/callback,则抛出错误

var express = require('express')
  , passport = require('passport')
  , util = require('util')
  , TwitterStrategy = require('passport-twitter').Strategy;

var TWITTER_CONSUMER_KEY = "--insert-twitter-consumer-key-here--";
var TWITTER_CONSUMER_SECRET = "--insert-twitter-consumer-secret-here--";

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

passport.use(new TwitterStrategy({
    consumerKey: TWITTER_CONSUMER_KEY,
    consumerSecret: TWITTER_CONSUMER_SECRET,
    callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"
  },
  function(token, tokenSecret, profile, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {

      return done(null, profile);
    });
  }
));

var app = express.createServer();

// configure Express
app.configure(function() {
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.logger());
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.session({ secret: 'keyboard cat' }));
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.get('/', function(req, res){
  res.render('index', { user: req.user });
});

app.get('/account', ensureAuthenticated, function(req, res){
  res.render('account', { user: req.user });
});

app.get('/login', function(req, res){
  res.render('login', { user: req.user });
});

app.get('/auth/twitter',
  passport.authenticate('twitter'),
  function(req, res){
    // The request will be redirected to Twitter for authentication, so this
    // function will not be called.
  });

app.get('/auth/twitter/callback', 
  passport.authenticate('twitter', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });

app.get('/logout', function(req, res){
  req.logout();
  res.redirect('/');
});

app.listen(3000);

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login')
}

内部OAuthError:无法获取访问令牌

如何解决此问题?

jxct1oxe

jxct1oxe1#

我在尝试运行passport-oauth2时遇到了类似的问题,正如您所观察到的,错误消息没有多大帮助:

InternalOAuthError: Failed to obtain access token
    at OAuth2Strategy._createOAuthError (node_modules/passport-oauth2/lib/strategy.js:382:17)
    at node_modules/passport-oauth2/lib/strategy.js:168:36
    at node_modules/oauth/lib/oauth2.js:191:18
    at ClientRequest.<anonymous> (node_modules/oauth/lib/oauth2.js:162:5)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:387:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)

我发现a suggestion对passport-oauth2做了一个小的修改:

--- a/lib/strategy.js
+++ b/lib/strategy.js
@@ -163,7 +163,10 @@ OAuth2Strategy.prototype.authenticate = function(req, options) {

    self._oauth2.getOAuthAccessToken(code, params,
        function(err, accessToken, refreshToken, params) {
-          if (err) { return self.error(self._createOAuthError('Failed to obtain access token', err)); }
+          if (err) {
+            console.warn("Failed to obtain access token: ", err);
+            return self.error(self._createOAuthError('Failed to obtain access token', err));
+          }

一旦我这样做了,我得到了一个更有帮助的错误消息:

Failed to obtain access token:  { Error: self signed certificate
    at TLSSocket.<anonymous> (_tls_wrap.js:1103:38)
    at emitNone (events.js:106:13)
    at TLSSocket.emit (events.js:208:7)
    at TLSSocket._finishInit (_tls_wrap.js:637:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:467:38) code: 'DEPTH_ZERO_SELF_SIGNED_CERT' }

在我的案例中,我认为根本原因是我测试的授权服务器使用了自签名SSL证书,我可以通过添加以下行来解决这个问题:

require('https').globalAgent.options.rejectUnauthorized = false;
von4xj4u

von4xj4u2#

同样,我也遇到了同样的问题。最后,我找到了一个解决方案与企业代理有关,您可以查看变通方案here

u5i3ibmn

u5i3ibmn3#

对于任何仍在为此而挣扎的人来说,在node-oauth包中提到了here
基本上,在更快的连接上,node-oauth接收ECONNRESET并触发提供的回调两次。解决这个问题的一个快速方法是在错误侦听器中的node_modules/oauth/lib/oauth2.js的第161行附近添加一行:

request.on('error', function(e) {
     if (callbackCalled) { return }  // Add this line
     callbackCalled= true;
     callback(e);
   });

2021年11月有already a PR关于这个问题,但是还没有合并,好像node-oauth已经不维护了,过去2个工作日我都在为这个问题挠头,希望大家能找到答案。
EDIT:PR已于2022年7月23日合并,但passport-oauth2和passport-google-oauth2中的依赖版本尚未更新。passport-oauth2 issuepassport-google-oauth2 issue

lh80um4z

lh80um4z4#

我认为您需要先获得TWITTER_CONSUMER_KEY和TWITTER_CONSUMER_SECRET。
How to obtain Twitter Consumer Key
然后将其插入到代码中。

zzlelutf

zzlelutf5#

我也遇到过同样的问题,我在使用cookie-session时,问题是我在回调中错误地返回了一个未定义的对象。

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:5000/auth/google/callback"
},
    async function (accessToken, refreshToken, profile, done) {

        const googleId = profile.id;
        const name = profile.displayName;
        const email = profile.emails[0].value;

        const existingUser = await User.findOne({googleId});

        if(existingUser){
            //as u can notice i should return existingUser instaded of user
            done(null, user); // <------- i was returning undefined user here.
        }else{
            const user = await User.create({ googleId, name, email });
            done(null, user);
        }
    }
));
arknldoa

arknldoa6#

我在GitHub认证中遇到了同样的问题,我发现添加中间件可以帮助解决这个问题,请查看下面的示例:-

app.get(
  "/auth/github",
  (req, res, next) => {
    if (req.user) {
      console.log("user");
      res.redirect("/dashboard");
    } else next();
  },
  passport.authenticate("github", {
    scope: ["user:email"],
  })
);

请注意:-这可能不是最好的解决方案,但对我来说很好。谢谢!祝你有一个美好的代码日:)

z31licg0

z31licg07#

我在使用多个策略进行Passport(Spotify & Google)时也面临着同样的问题,在调查了一段时间这个问题后,我在Github上发现了这个修复这个问题的Open PR
这是passport-oauth2上的一个已知问题,解决方案(直到PR被批准)是通过向我的项目包中添加一个覆盖来强制passport-oauth2使用oauth@0.10.0。json:

"overrides": {
    "oauth": "~0.10.0"
}

那将修正你的错误。

相关问题