我遇到一些问题,了解如何使用oAuth2rize和passport.js实现资源所有者密码流,特别是client_id和client_secret的传输,以便我可以对客户端进行一些检查,以确保任何事情都可以实现点(/ token)使用特定的"密码" grant type特别是官方应用程序,没有其他基于id和secret。
在构建解决方案时,我可以获得令牌,但这是在我尝试在客户端上进行任何验证之前。当我尝试访问传递给密码交换策略的客户端变量(发布到终点)时,我会收到基于文档的用户凭据(用户名,密码),但不是我需要在此处实现的。
我无法理解我如何获得实际的客户端凭据,我可以在密码功能源代码中看到,您可以提供其他选项来覆盖默认分配给[' user']但是这是否意味着我必须提供某种代码来添加到req对象?
我已经设置了一些集成测试,以下是我如何调用我的端点(使用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);
出于某种原因,我似乎完全在想这个,但出于某种原因,我完全被困......
答案 0 :(得分:4)
正如预期的那样,在发布令牌之前,我们使用本地策略而不是ClientPasswordStrategy并在密码交换中进行用户验证,这是一个理解问题。
我们现在正在使用ClientPasswordStrategy并在我们调用的exchange.password函数内部调用我们的用户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' });
});
});
}
));