我有一些问题,了解如何使用oAuth2rize和passport.js实现资源所有者密码流,特别是传输client_id和client_secret,以便我可以对客户端进行一些检查,以确保任何进入此终点的任何内容(/令牌)使用特定的“密码”授权类型具体是官方应用程序,没有其他基于id和秘密.
在构建解决方案时,我可以获得令牌,但这是在我尝试在客户端上进行任何验证之前.当我尝试访问传递给密码交换策略的客户端变量(发布到终点)时,我会收到基于文档的用户凭据(用户名,密码),但不是我需要在这里实现的.
我无法理解我如何获得实际的客户端凭据,我可以在密码函数源代码中看到,您可以提供其他选项来覆盖req [‘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);
出于某种原因,我似乎完全在想这个,但由于某种原因,我完全被困……
解决方法
正如预期的那样,在发布令牌之前,我们使用本地策略而不是ClientPasswordStrategy,并在密码交换中进行用户验证,这是一个理解问题.
我们现在正在使用ClientPasswordStrategy并在我们调用的exchange.password函数内部调用我们的用户api以验证用户凭据,如果可以,则发出令牌.
passport.use(new ClientPasswordStrategy( function(clientId,clientSecret,next){ Client.verify(clientId,function(err,verified){ if(!verified){ return next(null,false); } next(null,clientId); }); } )); passport.use(new BearerStrategy( function(token,next) { Token.getByToken(token,tokenObj){ if(err) return next(err); if(!tokenObj) return next(null,false); User.getByUsername(tokenObj.username,user){ return next(null,user,{ scope: 'all' }); }); }); } ));