我的问题类似于这个不接受答案的问题: 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
使用了错误的集合名称,否则我认为不是。
感谢您提供任何帮助!
答案 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 ..