invalid_client при первоначальной настройке node-restify-oauth2-mongodb

Мой вопрос похож на этот вопрос, на который не был получен ответ: oauth2-mongodb

Однако мой немного отличается тем, что коллекция clientKeys названа правильно, по крайней мере, я так думаю.

Когда я захожу в свой экземпляр монго и смотрю на свои коллекции, у меня есть:

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" : "[email protected]",
    "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 protected]&username=tester1&password=testing27&vPassword=testing27&role=Admin" http://localhost:8090/register

На что он отвечает, как он говорит, вот так:

{
    "__v":0,
    "name":"Test",
    "email":"[email protected]",
    "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, но я так не думаю.

Спасибо за любую помощь, которую вы можете предоставить!


person gmaniac    schedule 14.10.2014    source источник
comment
Я просмотрел, и похоже, что коллекция должна называться ClientKey на основе этой строки в hooks.js. var Client = mongoose.model('ClientKey'); Я изменил свою коллекцию в монго, и это все равно не сработало. Любая помощь будет оценена, спасибо!   -  person gmaniac    schedule 15.10.2014


Ответы (2)


Итак, после прохождения процесса я обнаружил, что в hooks.js они получают неправильные параметры для validateClient строки 35 и grantUserToken строки 52.

Вот что вам нужно будет изменить, чтобы это приложение заработало.

строка 35

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

to

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

строка 39

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

to

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

строка 52

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

to

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

строка 54

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

to

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

строка 61

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

to

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

строка 65 и 66

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

to

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

строка 70

redisClient.set(token, username);

to

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)

to

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

Если вы запустите эту команду

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

Ваш ответ будет

{
    "message":"Success"
}

Удачного кодирования!

person gmaniac    schedule 15.10.2014

Я использовал тот же код... и он работает... Я думаю, вы неправильно вставили запись для модели ClientKey... это ясно из сообщения обратной связи.

так должно быть :

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

Обратите внимание на название коллекции clientkeys, а не ClientKey и не ClientKeys.. оно должно следовать за именем модуля + s..

person Maher Abuthraa    schedule 04.03.2015
comment
это было больше, чем просто название коллекции, спасибо за пост - person gmaniac; 04.03.2015