在passport.js中为OAuth策略动态指定重定向url的最佳方法是什么?

在passport.js中为OAuth策略动态指定重定向url的最佳方法是什么?,oauth,passport.js,Oauth,Passport.js,我已按passportjs文档设置facebook身份验证: var passport = require('passport') , FacebookStrategy = require('passport-facebook').Strategy; passport.use(new FacebookStrategy({ clientID: FACEBOOK_APP_ID, clientSecret: FACEBOOK_APP_SECRET, callbackURL

我已按passportjs文档设置facebook身份验证:

var passport = require('passport')
  , FacebookStrategy = require('passport-facebook').Strategy;

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://www.example.com/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) { ... });
  }
));

app.get('/login/facebook', passport.authenticate('facebook'))
   .get('/facebook/callback', passport.authenticate('facebook', {successRedirect: '/', failureRedirect: '/login'}));
这一切都很好。但是,在某些情况下(例如令牌过期),我希望在启动登录请求之前自动将用户重定向到用户所在的页面。因此,我尝试通过登录请求(从客户端到服务器,再到facebook,再回到facebook)找到一个查询字符串param。但是我看不到在callbackURL中指定的方法

此外,当我尝试将一些上下文参数编码到config callbackURL(例如:“”)时,我得到了一个OAuth解析错误。有趣的是,Facebook确实正确地响应了访问代码和redir参数,但失败的原因是OAUTH异常:

FacebookTokenError: Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request
   at Strategy.parseErrorResponse (C:\Sources\node_modules\passport-facebook\lib\strategy.js:198:12)
   at Strategy.OAuth2Strategy._createOAuthError (C:\Sources\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:345:16)
   at C:\Sources\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:171:43
   at C:\Sources\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:177:18
   at passBackControl (C:\Sources\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9)
   at IncomingMessage.<anonymous> (C:\Sources\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7)
   at IncomingMessage.emit (events.js:117:20)
   at _stream_readable.js:943:16
   at process._tickCallback (node.js:419:13)
FacebookTokenError:验证验证代码时出错。请确保重定向uri与OAuth对话框请求中使用的uri相同
在Strategy.parseErrorResponse(C:\Sources\node\u modules\passport facebook\lib\Strategy.js:198:12)
在Strategy.OAuth2Strategy.\u创建OAutherror(C:\Sources\node\u modules\passport facebook\node\u modules\passport-oauth2\lib\Strategy.js:345:16)
在C:\Sources\node\u modules\passport facebook\node\u modules\passport-oauth2\lib\strategy.js:171:43
在C:\Sources\node\u modules\passport facebook\node\u modules\passport-oauth2\node\u modules\oauth\lib\oauth2.js:177:18
在passBackControl(C:\Sources\node\u modules\passport facebook\node\u modules\passport-oauth2\node\u modules\oauth\lib\oauth2.js:124:9)
在收到消息时。(C:\Sources\node\u modules\passport facebook\node\u modules\passport-oauth2\node\u modules\oauth\lib\oauth2.js:143:7)
在IncomingMessage.emit(events.js:117:20)
在_stream_readable.js:943:16
在进程中调用(node.js:419:13)
注意,我以前使用WIF工作过。我认为通过OAuth进程传递额外的查询字符串参数没有任何安全问题


你知道我该如何克服这一点吗?

我不知道该如何满足你的要求,但为了实现你想要的最终目标,你可以:

  • 验证前保存cookie
  • 对用户进行身份验证
  • 在生成的回调页面上,检查cookie并重定向(如果存在)

  • 这不是很容易吗?

    在我的场景中,将状态保存在cookie中是有问题的,原因有很多。在任何情况下,我发现这可以通过使用策略的状态参数来实现。