Passport.js模块,未定义的callbackURL

时间:2014-08-19 15:09:39

标签: javascript node.js drupal-7 passport.js

在设置Drupal后,本指南说:Drupal-passport我创建了一个简单的简单节点应用来测试它的工作原理。

它没有,我收到InternalOAuthError: Failed to obtain request token错误。

通过strategy.js,我看到我的callbackURL正在退出undefined并不完全确定原因。 callbackURL在我的Drupal应用程序中设置

同时预先形成curl -i -XPOST http://extranet.local/rest/system/connect/可以完全满足我的需要

这是我的node.js代码(请记住这只是测试drupal设置)。

var express = require('express');
var passport = require('passport');
var dStrategy = require('passport-drupal').DrupalStrategy;
var passportDrupal = require('passport-drupal');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser')
var session = require('express-session');
var http = require('http');

var app = express();
var server = http.createServer(app);

app.use(cookieParser());
app.use(bodyParser());
app.use(session({ secret: 'SECRET' }));
app.use(passport.initialize());
app.use(passport.session());

passport.use(new dStrategy({
    consumerKey: "emDVp7P2LZFLPcN3cNCjLmrjrhQLnNv6",
    consumerSecret: "mkbc3UYEuUQLNQRwLWo3B8zEk4ZrErKa",
    providerURL: "http://extranet.local",
    resourceEndpoint: "rest/system/connect", // <---- optional. Defaults to `rest/system/connect`
    callbackURL: 'http://33.33.33.40:8888/auth/drupal/callback'
  },
  function(token, tokenSecret, profile, done) {
    profile.oauth = { token: token, token_secret: tokenSecret };
    done(null, profile);
  }
));
app.get('/', function(req, res) {
  res.writeHead(200);
  res.end("This is root");
});
app.get('/auth/drupal',
  passport.authenticate('drupal'),
  function(req, res) {
    // The request will be redirected to the Drupal website for
    // authentication, so this function will not be called.
});
app.get('/auth/drupal/callback',
  passport.authenticate('drupal', { failureRedirect: '/error' }),
  function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/signedin');
});

app.get('/error', function(req, res) {
  res.writeHead(200);
  res.end("Could not sign in");
});
app.get('/signedin', function(req, res) {
  res.writeHead(200);
  res.end("signed in");
});

server.listen(8888, '33.33.33.40');

关于为什么或想法受到高度赞赏的任何线索

1 个答案:

答案 0 :(得分:3)

如果查看库strategy.jspassport-drupal代码,您会看到DrupalStrategy构造函数不期望options参数对象中有callbackURL属性,它也没有将它进一步传递到OAuthStrategy

这是为oauth策略创建参数的代码段:

  // Determine all necessary OAuth options
  var oauthOptions = {
    requestTokenURL: this._providerURL + '/oauth/request_token',
    accessTokenURL: this._providerURL + '/oauth/access_token',
    userAuthorizationURL: this._providerURL + '/oauth/authorize',
    consumerKey: options.consumerKey,
    consumerSecret: options.consumerSecret
  };

  OAuthStrategy.call(this, oauthOptions, verify);

应修改它以传递callbackURL,例如:

  // Determine all necessary OAuth options
  var oauthOptions = {
    requestTokenURL: this._providerURL + '/oauth/request_token',
    accessTokenURL: this._providerURL + '/oauth/access_token',
    userAuthorizationURL: this._providerURL + '/oauth/authorize',
    consumerKey: options.consumerKey,
    consumerSecret: options.consumerSecret,
    callbackURL: options.callbackURL// <==== THIS LINE WAS ADDED
  };

  OAuthStrategy.call(this, oauthOptions, verify);

我不确定这会解决你的问题。但我做了pull request