我正试图在服务器上使用基于json webtoken(jwt)的身份验证,并使用第三方(比如google)对用户进行身份验证。最初我已经设法在我的jsonwebtoken
服务器上使用nodejs
构建我自己的登录和jwt处理方案,但是我们需要在iOS系统上运行的客户端与它进行交互并开始寻找解决方案我们不必编写那么多客户端代码(在过期时请求新令牌等)并认为我们会使用第三方库为我们这样做。
事情是我没有找到任何可以为我们做这件事。我找到了可以处理客户端连接到客户端的谷歌api的库,我找到了谷歌处理的用户身份识别,但没有找到任何可以处理实际获得jwt
服务器除了作为真正的服务器用户。
我的问题基本上是这样的:我们有一个iOS客户端和一个nodejs服务器,并希望使用谷歌来验证我们的用户,并让客户端在我们的nodejs服务器上调用api-s,同时尽可能多地处理身份验证过程一些第三方图书馆(google's?),我们应该如何解决这个问题呢?
作为一个注释,我看过passport
,但这似乎仅适用于会话,如果我使用它,我必须自己解决jwt处理问题。
答案 0 :(得分:0)
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
中任何路由的每次呼叫都必须使用有效的Google令牌发送id_token
才能获得访问权限。