iOS 客户端 nodejs 服务器中的 jwt 身份验证通过第三方身份验证器

jwt authentication in iOS client nodejs server via third party authenticator

我正在尝试在服务器上使用基于 json webtoken (jwt) 的身份验证,并结合使用第三方(比如 google)来对用户进行身份验证。最初我已经设法在我的 nodejs 服务器上使用 jsonwebtoken 构建了我自己的登录和 jwt 处理方案,但是我们需要 iOS 系统上的客户端 运行 来与之交互它并开始寻找一个解决方案,我们不必编写太多客户端代码(过期时请求新令牌等),并认为我们会使用第三方库来为我们做这件事。

问题是我没有找到任何可以为我们做到这一点的东西。我找到了可以处理将客户端连接到客户端的 google api 的库,我发现 google 处理的用户标识,但没有找到任何可以处理实际获取 jwt 服务器将排除为真正的用户。

我的问题本质上是这样的:我们有一个 iOS 客户端和一个 nodejs 服务器,想使用 google 来验证我们的用户并让客户端调用 api-s在我们的 nodejs 服务器上,由于一些第三方库(google 的?)处理了尽可能多的身份验证过程,我们应该如何解决这个问题?

请注意,我已经看到 passport,但这似乎只适用于会话,如果我要使用它,我必须自己解决 jwt 处理。

iOS 部分还没有准备好,但我设法使用 google 在浏览器中没有会话的情况下进行身份验证和授权。这个想法是,客户端登录 google(参见 here for web app) and google graciously also gives you a token with the login, which will be good for the server. On the nodejs side I used passport and the google-id-token strategy (see on github). There are quite a few strategies for google out there, but this one works. Although, this has a shortcoming, it can't accept the token in the header, but I fixed that in a pull request (see here)。

由于我对如何使用所有护照示例的 User.findOrCreate 部分有一点疑问,我将在此处放入我的代码,其中包含一个完整的工作示例:

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

passport.use(new GoogleTokenStrategy({
    clientID: config.googleAuth.clientID,
    clientSecret: config.googleAuth.clientSecret,
  },
  function(parsedToken, googleId, done) {
    console.log(parsedToken);
    console.log(googleId);

      User.findOne({ 'google.id': googleId }, function (err, user) {
          if (!user) {
              var testuser = new User({ 
                name: parsedToken.payload.name,
                givenName : parsedToken.payload.givenName,
                familyName : parsedToken.payload.familyName,
                nameunderscore : parsedToken.payload.name.split(' ').join("_"),

              admin: false,
          email: parsedToken.payload.email,
          settings: {save_folder:"default"},
          'google.id' : googleId,
          'google.email' :  parsedToken.payload.email,
          });
        testuser.save(function(err) {})

        }
        return done(err, user);
      });
  }
));

用户来自 mongodb 在一个单独的 js:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('User', new Schema({ 
    name: String,
    nameunderscore : String,
    givenName: String,

    familyName: String,
    admin: Boolean,
    settings: {
        save_folder: String
        },
    email: String,
    google: {
        id: String,
        email: String
        }
}));

这就是我将 passport 策略添加到路由器的方式(注意会话设置为 false):

var apiRoutes = express.Router();
apiRoutes.use(passport.authenticate('google-id-token',{ session: false }));

现在每次调用 apiRoutes 中的任何路由都必须在 id_token 上发送有效的 google 令牌才能获得访问权限。