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
发送一个有效的谷歌令牌才能访问。