2016-12-14 59 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發送一個有效的谷歌令牌才能訪問。