このログイン例を使用して Facebook 認証を設定しようとしています。例は機能しますが、ログアウトして再度ログインしようとすると、facebook ユーザーを変更するオプションが表示されずにパスポートが自動的にログインできます。この動作を変更する方法について何か考えはありますか?
4 に答える
デフォルトでは、Facebook でのログインをすでに承認している場合、以降の認証要求は自動的に行われ、ユーザーに再度承認を求めるプロンプトは表示されません。この動作を変更するには、次の 3 つのオプションがあります。
1. ユーザーを Facebook からログアウトする
ユーザーをアプリケーションからログアウトするだけで、Facebook を完全にログアウトする必要はないため、これは望ましくありません。
2. Facebook アプリケーションからユーザーの認証を解除する
これが最善の策です。これを行うには、有効な Facebook アクセス トークンを使用して をHTTP DELETE
呼び出します。https://graph.facebook.com/me/permissions
詳細については、https://developers.facebook.com/docs/reference/api/user/#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);
});
}
));
Facebook Passport は auth_type をサポートしています。これにより、ユーザーがブラウザーにログインしている場合でも、アプリの OAuth トークンに再度サインインするようにユーザーをリダイレクトします。Facebook でこの再ログイン動作を有効にするには、次のコードを使用します。
passport.authenticate('facebook', {authType: 'reauthenticate', callbackURL:...
Facebook からもログアウトする必要があります (または、設定のリストからアプリケーションを削除します)。そうしないと、Facebook はユーザー (あなた) がアプリへのログインを受け入れたことを記憶し、何も尋ねずにアプリケーションに戻ります。
options を見ると、値は {} であり、コンストラクターのオプションとして、または認証オプションとして配置する代わりに、フィールドauth_type = "reauthenticate"を authorizationParams に追加しました (両方とも機能しませんでした)。
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) {
......
}));