2016-12-14 8 views
1

私は、json webtoken(jwt)ベースの認証をサーバ上で使用し、ユーザを認証するためにサードパーティ(google)を使用することに慣れています。もともと私はjsonwebtokenの自分のログインとjwtの処理スキームを私のnodejsサーバ上に構築していましたが、iOSシステム上で動作するクライアントが必要で、それを操作する必要があり、コードを書く必要がないソリューションを探し始めました非常に多くのクライアントコード(期限切れになると新しいトークンを要求するなど)、私たちがこれを行うためにサードパーティのライブラリを使用すると考えました。iOSクライアントのjwt認証第三者オーセンティケータ経由のnodejsサーバ

私たちのためにこれを行うものは見つかりませんでした。クライアントのGoogle APIにクライアントを接続できるライブラリが見つかりました.Googleで処理されたユーザーIDが見つかりましたが、実際にjwtという本を実際のユーザーとして除外することを処理するものは見つかりませんでした。

私はiOSクライアントとnodejsサーバーを持っており、Googleを使用してユーザーを認証し、nodejsサーバーでapi-sを呼び出すようにしたいと考えています。いくつかのサードパーティの図書館(Googleの?)によって、どうやってこの問題に取り組まなければなりませんか?

私はpassportを見たことがありますが、それはセッションのみで動作するようですが、私はそれを使用するために自分でjwtの処理を解決しなければならないでしょう。

答えて

0

iOSの部分は準備ができていませんが、ブラウザでセッションなしで認証して認証するためにgoogleを使用することができました。クライアントがGoogleにログインすると(ウェブアプリケーションの場合はhereを参照)、グーグルではログインにトークンを渡すこともできます。このトークンはサーバーに適しています。 nodejs側では、passportgoogle-id-tokenという戦略を使用しました(githubを参照)。そこにGoogleのためのかなりの戦略がありますが、これは動作します。これには欠点がありますが、ヘッダーにトークンを受け入れることはできませんが、私はプルリクエスト(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); 
     }); 
    } 
)); 

ユーザー別のjsmongodbから来ている:

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 
     } 
})); 

そして、これは私が(そのセッションがfalseに設定されていることに注意)ルータにpassport戦略を追加する方法です:

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

今すぐapiRoutesにあるすべてのルートを呼び出す場合は、有効なgoogleトークンを使用してid_tokenを送信してアクセスする必要があります。

関連する問題