5

我正在尝试使用此登录示例设置 facebook 身份验证。示例有效,但是当我注销并尝试再次登录时,护照会自动让我进入,而无需让我选择更改 facebook 用户。关于如何改变这种行为的任何想法?

4

4 回答 4

6

默认情况下,如果您已经授权使用 Facebook 登录,后续的身份验证请求将自动进行,不会提示用户再次授权。可以通过三个选项来更改此行为:

1. 让用户退出 Facebook

这是不可取的,因为您只想让用户退出您的应用程序,而不是完全退出 Facebook。

2. 从您的 Facebook 应用程序中取消对用户的授权

这是你最好的选择。为此,请使用有效的 Facebook 访问令牌进行HTTP DELETE调用。在https://developers.facebook.com/docs/reference/api/user/#permissionshttps://graph.facebook.com/me/permissions阅读更多内容。

3.强制用户每次登录时重新认证

Facebook 支持一个auth_type参数,设置为 时会提示用户每次登录reauthenticate在https://developers.facebook.com/docs/howtos/login/client-side-re-auth/阅读更多内容。

Passport.js 不支持开箱即用地传递此参数,因此您可能需要做一些修改才能使其在您的应用程序中工作,或者向 passport-facebook GitHub 项目提交拉取请求。

但是,您可以选择提示用户每次使用特定参数重新进行身份验证。工作但不推荐的方法如下:

FacebookStrategy.prototype.authorizationParams = function (options) {
  var params = {},
      display = options.display,
      auth_type = options.auth_type;
  if (display) params['display'] = display;
  if (auth_type) params['auth_type'] = auth_type;
  return params;
};
passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://localhost:3000/auth/facebook/callback",
    auth_type: "reauthenticate"
  },
  function(accessToken, refreshToken, profile, done) {
    process.nextTick(function () {
      return done(null, profile);
    });
  }
));
于 2013-03-08T23:44:36.113 回答
3

Facebook Passport 支持 auth_type,即使用户在浏览器上登录,它也会重定向用户以再次登录应用程序的 OAuth 令牌。要在 Facebook 上启用此重新登录行为,请使用以下代码

passport.authenticate('facebook', {authType: 'reauthenticate', callbackURL:...
于 2013-12-15T03:49:16.270 回答
0

您也需要从 facebook 注销(或从您的设置列表中删除该应用程序)。否则,facebook 会记住用户(您)已接受登录您的应用程序并返回应用程序而不询问您任何内容。

于 2012-10-29T22:02:58.630 回答
0

当查看选项时,值为 {} ,然后我在authorizationParams 中添加了字段auth_type = "reauthenticate",而不是作为选项放在构造函数中或作为身份验证选项(两者都不适用于我)。

var fbStrategy = require('passport-facebook').Strategy;
fbStrategy.prototype.authorizationParams = function (options) {
var params = {};
params.auth_type = "reauthenticate";
// params.auth_nonce = hash.digest((new Date()).getTime());
// console.log(options,":options",params)
return params;
};
passport.use('facebook',new fbStrategy({
  clientID: process.env.clientID,
  clientSecret: process.env.clientSecret,
  callbackURL: yourcallbackURL,
   // this option to pass req
  passReqToCallback : true
},
  function (req, accessToken, refreshToken, profile, cb) {
    ......
 }));
于 2018-12-17T17:41:13.700 回答