所以我正在尝试使用panda的node-oidc-provider库,使用typescript来实现一个openID Connect服务器。
尝试将授权代码交换为身份验证令牌时遇到问题。基本上它说代码没有找到,虽然我可以在 mongo 数据库中看到该文档,并且在库使用的适配器的查找函数中放置一个 console.log 来检索代码,它确实被找到了。
我使用此网址获得身份验证:
http://localhost:3000/auth?client_id=test&response_type=code&scope=openid
然后从邮递员那里我会发送这个请求:
POST http://localhost:3000/token
REQ HEADERS
Content-Type:application/x-www-form-urlencoded
REQ BODY
grant_type:authorization_code
code:rekLjZKPFPk0pPSBJKlgqFt0tPtCq1k03ktS8CUh_X6
client_id:test
client_secret:testsecret
redirect_uri:https://lvh:8080/cb
响应如下:
{
"error": "invalid_grant",
"error_description": "grant request is invalid"
}
深入研究库,我lib/actions/grants/authorization_code.js
在第 38 行的 if 检查之前将 console.log 放入文件中。在那里我可以看到该ctx.oidc.params.code
变量已使用 auth_code 正确设置,但是从 const 行检索到的代码code = await ctx.oidc.provider.AuthorizationCode.find
是未定义的。
这是我的 oidc-config:oidc-config
这是 mongodb 适配器:mongodb-adapter
鉴于我在调试代码中放入的控制台日志,这是我从邮递员发送令牌请求时得到的输出:
Received code: rekLjZKPFPk0pPSBJKlgqFt0tPtCq1k03ktS8CUh_X6
MongoAdapter#find rekLjZKPFPk0pPSBJKlgqFt0tPtCq1k03ktS8CUh_X6
MongoAdapter#coll authorization_code oidc.authorization_code
MongoAdapter#find result {
iat: 1570099703,
exp: 1570105703,
accountId: 5d937633b00ba1073edaa689,
authTime: 1570099703,
claims: { rejected: [] },
grantId: 'JEMh2GsZaEjlgeGx9MXT0',
redirectUri: 'https://lvh:8080/cb',
scope: 'openid',
sessionUid: 'QA3vhV_8-Jlgc8583_aGZ',
kind: 'AuthorizationCode',
jti: 'rekLjZKPFPk0pPSBJKlgqFt0tPtCq1k03ktS8CUh_X6',
clientId: 'test',
expiresWithSession: true
}
MongoAdapter#coll session oidc.session
Found code: undefined
InvalidGrant authorization code not found
我很确定错误是我的,而不是库中的错误。但我似乎无法理解我做错了什么。
更新
进入调试模式,我看到它实际上是在第 26 行的文件lib/models/mixins/is_session_bound.js
: >assert.equal(token.accountId, session.accountId(), 'token and session principal are now different');
但我仍然不知道这意味着什么。