web-dev-qa-db-ja.com

InternalOAuthError:アクセストークンの取得に失敗しました

リンク内の以下のコードの何が問題になっているのか誰かが私を助けてくれますか GitHub oauth2-パスポート付きのプロバイダーサーバー-oauth2コンシューマー

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')
} 

InternalOAuthError:アクセストークンの取得に失敗しました

この問題を解決するにはどうすればよいですか?

20
user3180402

ここでも同じ問題が発生しました。最後に解決策が企業プロキシに関連していることがわかりました。回避策を確認できます ここ

7
Victor R Hdez

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)

私は 提案 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;
5
bmaupin

最初にTwitter_CONSUMER_KEYとTwitter_CONSUMER_SECRETを取得する必要があると思います。方法は次のとおりです。

Twitterコンシューマーキーの取得方法

次に、それをコードにプラグインします。

1
sunyata