使用oAuth2orize传递可信客户端信息,以获取"资源所有者密码流"

时间:2013-05-20 16:34:12

标签: node.js oauth-2.0 passport.js

我遇到一些问题,了解如何使用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);

出于某种原因,我似乎完全在想这个,但出于某种原因,我完全被困......

1 个答案:

答案 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' });
        });
    });
}
));