我在理解如何使用oAuth2rize和passport.js实现资源所有者密码流时遇到了一些问题,特别是在传输client_id和client_secret的情况下,这样我就可以在客户端进行一些检查,以确保使用特定“密码”授权类型进入此端点(/token)的任何内容都是特定的官方应用程序,而不是其他基于id和密钥的应用程序。
在构建解决方案时,我可以得到一个令牌,但那是在我尝试在客户机上进行任何验证之前。当我尝试访问传递到密码交换策略中的客户端变量(posted到端点)时,我收到了用户凭据(用户名、密码),这是基于文档的预期结果,但不是我在这里需要实现的结果。
我不知道如何获得实际的客户端凭据,我可以在密码函数源代码中看到,您可以提供额外的选项来覆盖请求‘’user‘的默认赋值,但这是否意味着我必须提供某种代码来添加到请求对象中?
我已经设置了一些集成测试,下面是我如何调用我的端点(使用SuperTest):
request('http://localhost:43862')
.post('/oauth/token')
.type('form')
.send({ grant_type: 'password' })
.send({ client_id: 'goodClient' })
.send({ client_secret: 'asecret' })
.send({ username: 'good@user.com' })
.send({ password: 'goodpassword' })
.expect(200, done);出于某种原因,我似乎完全想多了,但出于某种原因,我完全被难住了……
发布于 2013-05-21 22:35:25
正如预期的那样,这是一个理解问题,我们使用本地策略而不是ClientPasswordStrategy,在颁发令牌之前在密码交换中进行用户验证。
我们现在使用ClientPasswordStrategy,并在exchange.password函数中调用和内部调用我们的user api来验证用户凭据,如果没有问题,则颁发令牌。
passport.use(new ClientPasswordStrategy(
function(clientId, clientSecret, next){
Client.verify(clientId, clientSecret, function(err, verified){
if(!verified){
return next(null, false);
}
next(null, clientId);
});
}
));
passport.use(new BearerStrategy(
function(token, next) {
Token.getByToken(token, function(err, tokenObj){
if(err)
return next(err);
if(!tokenObj)
return next(null, false);
User.getByUsername(tokenObj.username, function(err, user){
return next(null, user, { scope: 'all' });
});
});
}
));https://stackoverflow.com/questions/16654078
复制相似问题