在node-restify-oauth2-mongodb的初始设置中的invalid_client

时间:2014-10-14 20:16:24

标签: node.js mongodb redis mongoose restify

我的问题类似于这个不接受答案的问题: Problems using node-restify-oauth2-mongodb

然而,我的有点不同,clientKeys集合的名称是正确的,或者至少我是这么认为的。

当我进入我的mongo实例并查看我的收藏时,我有:

clientkeys
users

当我看到这些藏品中的内容时,我看到了:

> db.clientkeys.find().pretty()
{
    "_id" : ObjectId("51c6e846ede91c0b8600005e"),
    "clientName" : "Test Client",
    "client" : "test",
    "secret" : "password"
}

> db.users.find().pretty()
{
    "_id" : ObjectId("543d7b974f1870f131c6d0aa"),
    "name" : "Test",
    "email" : "test@test.com",
    "username" : "tester1",
    "hashed_password" : "$2a$10$gpMXyCuILBbMF2K6Aroc7.lKoIpuGhvL98ZGGoE0tEOtYSQaCpMde",
    "role" : "Admin",
    "__v" : 0
}

我按照回购中的指示: https://github.com/rgallagher27/node-restify-oauth2-mongodb

所以我运行这个:

curl --data "name=Test&email=test@test.com&username=tester1&password=testing27&vPassword=testing27&role=Admin" http://localhost:8090/register

它回答了他的说法,如下:

{
    "__v":0,
    "name":"Test",
    "email":"test@test.com",
    "username":"tester1",
    "hashed_password":"$2a$10$3uwD9IiKVlkQJvdQXqm07uQnfcXae3AGjDh.zil8.8CgtlQ2MuACK",
    "_id":"520774753472d74e2c000001",
    "role":"Admin"
}

然后我运行以下命令:

curl --user test:password --data grant_type=password --data username=tester1 --data password=testing27 http://localhost:8090/token
然而,

然后返回:

{
    "error":"invalid_client",
    "error_description":"Client ID and secret did not validate."
}

我无法弄清楚我错过了什么。除非我为clientkeys使用了错误的集合名称,否则我认为不是。

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:1)

因此,在完成整个过程后,我发现hooks.js他们在validateClient第35行和grantUserToken第52行收到了错误的参数。

以下是您需要更改以使此应用有效的方法。

第35行

exports.validateClient = function (clientId, clientSecret, cb)

exports.validateClient = function (clientCredentials, req, cb)

第39行

Client.findOne({ client: clientId, secret: clientSecret }, function (err, client) {

Client.findOne({ client: clientCredentials.clientId, secret: clientCredentials.clientSecret }, function (err, client) {

第52行

exports.grantUserToken = function (username, password, cb)

exports.grantUserToken = function (allCredentials, req, cb)

第54行

var query = User.where( 'username', new RegExp('^' + username + '$', 'i') );

var query = User.where( 'username', new RegExp('^' + allCredentials.username + '$', 'i') );

第61行

} else if (user.authenticate(password)) {

} else if (user.authenticate(allCredentials.password)) {

第65和66行

var token       = generateToken(username + ":" + password);
var newToken    = new Token({ username: username, token: token });

var token       = generateToken(allCredentials.username + ":" + allCredentials.password);
var newToken    = new Token({ username: allCredentials.username, token: token });

第70行

redisClient.set(token, username);

redisClient.set(token, allCredentials.username);

希望这有助于某人,让我知道其他人是否有更好的解决方案。这对我有用。

现在我跑这个

curl --user test:password --data grant_type=password --data username=tester1 --data password=testing27 http://localhost:8090/token

这是我的回复

{
    "access_token":"S7QEwABRiv6HCSaXy70mUlxY7i/Un/EcgWpvbrBhXlw=",
    "token_type":"Bearer"
}

现在仍然在hooks.js更改行80

中的秘密路线
exports.authenticateToken = function (token, cb)

exports.authenticateToken = function (token, req, cb)

如果您运行此命令

curl -H "Authorization:Bearer Your-Bearer-Token" http://localhost:8090/secret

您的回复将是

{
    "message":"Success"
}

快乐的编码!

答案 1 :(得分:1)

我使用相同的代码..它的工作原理..我认为你没有正确插入条目ClientKey ..来自反馈信息。

它应该是:

db.clientkeys.insert({  
   clientName:"Test Client",
   client:"test",
   secret:"password"
})

请注意集合的名称 clientkeys 而不是 ClientKey ClientKeys ..它应该遵循模块名称+ s ..