Laravel Passport无效的刷新令牌-令牌未链接到客户端

ppcbkaq5  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(179)

我在Laravel 5.5上使用Passport,尝试刷新访问令牌时收到错误- * 仅在生产服务器上 * -本地开发环境工作正常!
以下是返回的错误:

{
"error": "invalid_request",
"message": "The refresh token is invalid.",
"hint": "Token is not linked to client"
}

我已验证令牌和客户端是否存在于数据库中、是否未过期、是否未被吊销、是否正确存储等。
因为系统是一个多租户系统(每个租户都有自己的数据库),所以我没有使用以下命令创建passport客户机

php artisan passport:client

相反,我为每个租户复制了passport oauth_clients表和内容-以便每个租户使用相同的客户端凭据,例如从前端登录、从应用程序登录(但使用不同的端点)。
我不知道为什么它在我的本地机器上工作得很好,但在生产中却不行。
除了在oauth_clients表中创建一行之外,有人知道php artisan passport:client到底做了什么吗?
我在想,也许需要的不仅仅是复制oauth_clients表的内容。
任何建议都很感谢!谢谢

b1zrtrql

b1zrtrql1#

在深入研究了供应商代码之后,我通过修改
vendor/league/oauth2-server/src/Grant/RefreshTokenGrant.php
函数验证OldRefreshToken
已更改

if ($refreshTokenData['client_id'] !== $clientId) {
        $this->getEmitter()->emit(new RequestEvent(RequestEvent::REFRESH_TOKEN_CLIENT_FAILED, $request));
        throw OAuthServerException::invalidRefreshToken('Token is not linked to client');
    }

if ($refreshTokenData['client_id'] != $clientId) {
        $this->getEmitter()->emit(new RequestEvent(RequestEvent::REFRESH_TOKEN_CLIENT_FAILED, $request));
        throw OAuthServerException::invalidRefreshToken('Token is not linked to client');
    }

即使$clientId匹配,也会向函数传递一个字符串(根据需要),但$refreshTokenData ['client_id']是一个整数。
格式

vsnjm48y

vsnjm48y2#

消息:“刷新标记无效”在OP描述的情况下似乎是误导性的。实际上,在对传递的client_id参数进行类型检查时引发了此异常。对我来说,传递的参数(client_id)的数据类型是string。它应该是一个数字(int)。
更改以下内容

client_id: "2"

结束日期

client_id: 2

解决了我的问题。
注:建议不要更改供应商。请在有效负载中查找client_id参数的数据类型。

相关问题