iOSの部分は準備ができていませんが、ブラウザでセッションなしで認証して認証するためにgoogleを使用することができました。クライアントがGoogleにログインすると(ウェブアプリケーションの場合はhereを参照)、グーグルではログインにトークンを渡すこともできます。このトークンはサーバーに適しています。 nodejs
側では、passport
とgoogle-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);
});
}
));
ユーザー別のjs
にmongodb
から来ている:
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
を送信してアクセスする必要があります。