2016-12-14 54 views
1

我想围绕使用json webtoken(jwt)基于身份验证的服务器耦合到使用第三方(谷歌)认证用户。最初我设法在我的nodejs服务器上创建了我自己的登录和jwt处理方案jsonwebtoken,但我们需要一个运行在iOS系统上的客户端与它交互,并开始寻找解决方案,我们不必编码太多的客户端代码(过期时请求新的令牌等),并认为我们会使用第三方库为我们做这件事。通过第三方认证的iOS客户端nodejs服务器中的jwt认证

事情是我没有找到任何可以为我们做到这一点的东西。我发现可以处理客户端连接到客户端的谷歌API的库,我发现谷歌处理的用户标识,但没有找到任何可以处理实际获得的服务器除了作为真正的用户之外的任何东西的jwt

我的问题基本上是这样的:我们有一个iOS客户端和一个nodejs服务器,并希望使用谷歌来验证我们的用户,并让客户端在我们的nodejs服务器上调用api-s,尽可能多的验证过程被处理通过一些第三方库(谷歌?),我们应该如何解决这个问题?

作为一个说明,我已经看到passport,但似乎只与会话操作,我必须解决自己的jwt处理是我使用它。

回答

0

iOS部分还没有准备好,但我设法使用谷歌进行身份验证和授权,无需浏览器中的会话。这个想法是,客户端登录到谷歌(见网页应用程序here)和谷歌优雅也给你一个令牌登录,这将是有利于服务器。在nodejs方面,我使用了passportgoogle-id-token策略(请参阅github)。谷歌有很多策略可用,但这是一个有效的方法。虽然这有一个缺点,但它不能接受标题中的标记,但我在拉取请求中修复了这一问题(请参阅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发送一个有效的谷歌令牌才能访问。