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

Jer*_*cob 6 oauth laravel laravel-passport

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

这是返回的错误:

{
"error": "invalid_request",
"message": "The refresh token is invalid.",
"hint": "Token is not linked to client"
}
Run Code Online (Sandbox Code Playgroud)

我已验证令牌和客户端存在于数据库中、未过期、未撤销、存储正确等。

因为该系统是一个多租户系统(每个租户都有自己的数据库),所以我没有使用该命令创建护照客户端

php artisan passport:client
Run Code Online (Sandbox Code Playgroud)

相反,我复制了每个租户的护照oauth_clients表和内容 - 以便每个租户使用相同的客户端凭据,例如从前端登录、从应用程序登录(但使用不同的端点)。

我不知道为什么它在我的本地机器上运行良好,但在生产环境中却运行不佳。

有谁知道php artisan passport:client除了在表中创建一行之外到底还能做什么oauth_clients

oauth_clients我想也许需要的不仅仅是复制表格内容。

任何建议表示赞赏!谢谢

Jer*_*cob 1

在深入研究供应商代码后,我通过修改解决了问题

供应商/league/oauth2-server/src/Grant/RefreshTokenGrant.php

函数 validateOldRefreshToken

改变了

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');
    }
Run Code Online (Sandbox Code Playgroud)

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');
    }
Run Code Online (Sandbox Code Playgroud)

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

fml。