Google 登录和 passport.js - 如何使用相同的路由处理来自 Android 和 iOS 的呼叫?

Google sign-in and passport.js - how to handle calls from Android and iOS using the same route?

我正在使用 passport.js 对来自 Android 和 iOS 应用程序的移动用户进行身份验证。

var GoogleTokenStrategy = require('passport-google-id-token');
var passport = require('passport');

module.exports = function(app) {
     app.use(passport.initialize());
     app.use(passport.session());

     passport.use(new GoogleTokenStrategy({
        clientID: "013323487228-563u02i6dk3vj3ic5q4l9g5r79vhqc4b.apps.googleusercontent.com"
     }, function(parsedToken, googleId, done) {
        // logic for finding user in db
     }
     ));

    app.post('/auth/google',
        passport.authenticate('google-id-token'),
        function (req, res) {
        res.send(req.user? 200 : 401);
        }
    );
}

但是,Android 和 iOS 应用程序的客户端 ID 不同。我该如何处理?我应该为这两种情况设置不同的端点吗?两种不同的策略?甚至每个案例有两个不同的路由文件?

只需在您的 POST 请求(platform: androidplatform: ios)中传递另一个参数,然后在服务器端对该变量进行操作。无需其他路线。

我还没有用 OAuth 策略测试过这个,但是你可以通过 naming them, and you can use multiple strategies in single route 拥有相同策略的多个实例。所以,也许你可以使用这些并使用两种策略:

var loginHandler = function(parsedToken, googleId, done) {
    // logic for finding user in db
};

passport.use('android', new GoogleTokenStrategy({
        clientID: "android-token"
    }, loginHandler));

passport.use('ios', new GoogleTokenStrategy({
        clientID: "iphone-token"
    }, loginHandler));

然后在 authenticate 调用中同时使用:

app.post('/auth/google', 
         passport.authenticate(['android', 'ios']), 
         function (req, res) {
    res.send(req.user ? 200 : 401);
});

或者,如果列出多个策略不起作用,则使用路由参数和 custom callback:

app.post('/auth/google/:platform(android|ios)', function(req, res, next) {
    passport.authenticate(req.params.platform, function(err, user, info) {
        // ...
    })(req, res, next);
});