iOS部分還沒有準備好,但我設法使用谷歌進行身份驗證和授權,無需瀏覽器中的會話。這個想法是,客戶端登錄到谷歌(見網頁應用程序here)和谷歌優雅也給你一個令牌登錄,這將是有利於服務器。在nodejs
方面,我使用了passport
和google-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
發送一個有效的谷歌令牌才能訪問。