You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel扩展Passport AccessTokenController时调用respondToAccessTokenRequest报空错误

Laravel Passport 继承 AccessTokenController 时出现 "Call to a member function respondToAccessTokenRequest() on null" 错误解决

我是Laravel新手,尝试通过继承Laravel Passport的AccessTokenController类来生成OAuth令牌,但始终遇到如下错误:

"message": "Call to a member function respondToAccessTokenRequest() on null"

自定义控制器代码

class B2BTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController
{
    function issueB2BToken(ServerRequestInterface $request)
    {
        $req = $request->withParsedBody([
            "grant_type" => "client_credentials",
            "client_id" => $request->getHeaderLine('X-CLIENT-KEY'),
            "client_secret" => $request->getHeaderLine('X-SIGNATURE'),
        ]);


        $response = parent::issueToken($req);

        return $response->getContent();
    }
}

原生 AccessTokenController 代码

class AccessTokenController
{
    use HandlesOAuthErrors;

    /**
     * The authorization server.
     *
     * @var \League\OAuth2\Server\AuthorizationServer
     */
    protected $server;

    /**
     * The token repository instance.
     *
     * @var \Laravel\Passport\TokenRepository
     */
    protected $tokens;

    /**
     * Create a new controller instance.
     *
     * @param  \League\OAuth2\Server\AuthorizationServer  $server
     * @param  \Laravel\Passport\TokenRepository  $tokens
     * @return void
     */
    public function __construct(AuthorizationServer $server,
                                TokenRepository $tokens)
    {
        $this->server = $server;
        $this->tokens = $tokens;
    }

    /**
     * Authorize a client to access the user's account.
     *
     * @param  \Psr\Http\Message\ServerRequestInterface  $request
     * @return \Illuminate\Http\Response
     */
    public function issueToken(ServerRequestInterface $request)
    {
        return $this->withErrorHandling(function () use ($request) {
            return $this->convertResponse(
                $this->server->respondToAccessTokenRequest($request, new Psr7Response)
            );
        });
    }
}

问题原因

父类AccessTokenController的$server和$tokens属性依赖构造函数注入实例,自定义控制器未显式调用父类构造函数,导致这两个属性未初始化,调用$this->server->respondToAccessTokenRequest()时触发空指针错误。

解决方法

在自定义控制器中添加构造函数,继承父类的依赖注入逻辑:

class B2BTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController
{
    // 显式调用父类构造函数,确保依赖实例被正确注入
    public function __construct(\League\OAuth2\Server\AuthorizationServer $server, \Laravel\Passport\TokenRepository $tokens)
    {
        parent::__construct($server, $tokens);
    }

    function issueB2BToken(\Psr\Http\Message\ServerRequestInterface $request)
    {
        $req = $request->withParsedBody([
            "grant_type" => "client_credentials",
            "client_id" => $request->getHeaderLine('X-CLIENT-KEY'),
            "client_secret" => $request->getHeaderLine('X-SIGNATURE'),
        ]);

        $response = parent::issueToken($req);

        return $response->getContent();
    }
}

额外注意事项

  • 确保路由正确配置,指向B2BTokenController@issueB2BToken方法
  • 请求必须携带X-CLIENT-KEY和X-SIGNATURE请求头,且对应的值是有效的Passport客户端ID和密钥

内容的提问来源于stack exchange,提问作者Gusti Arya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:45:14