Laravel Passport - oauth/token 导致客户端身份验证失败

时间:2021-05-26 17:42:44

标签: php laravel oauth-2.0 laravel-passport

我已经安装了 Laravel Passport。

这是我生成验证码的方法:

public function auth(Request $request)
{
    $request->session()->put('state', $state = Str::random(40));

    $request->session()->put(
        'code_verifier', $code_verifier = Str::random(128)
    );

    $codeChallenge = strtr(rtrim(
        base64_encode(hash('sha256', $code_verifier, true))
        , '='), '+/', '-_');

    $query = http_build_query([
        'client_id' => '1',
        'redirect_uri' => 'http://127.0.0.1:8000/authorize/response',
        'response_type' => 'code',
        'scope' => '',
        'state' => $state,
        'code_challenge' => $codeChallenge,
        'code_challenge_method' => 'S256',
    ]);

    return redirect('http://127.0.0.1:9000/oauth/authorize?'.$query);
}

以上请求都通过了。 这是我尝试生成访问令牌的方法:

public function authResponse(Request $request)
{
    $state = $request->session()->pull('state');

    throw_unless(
        strlen($state) > 0 && $state === $request->state,
        InvalidArgumentException::class
    );

    $response = Http::asForm()->post('http://127.0.0.1:9000/oauth/token', [
        'grant_type' => 'authorization_code',
        'client_id' => '1',
        'client_secret' => 'hYMELQ1VKAWrG0TwrkM3JxUuoICSCWCzCztClZZi',
        'redirect_uri' => 'http://127.0.0.1:8000/authorize/response',
        'code' => $request->code,
    ]);

    return $response->json();
}

当我执行生成访问令牌的代码时,出现以下错误:

<块引用>

{"error":"invalid_client","error_description":"客户端认证 failed","message":"客户端认证失败"}

知道这个错误的原因是什么吗?我已从数据库中取出 client_secret

知道可能是什么问题以及如何解决吗?

1 个答案:

答案 0 :(得分:0)

您没有从会话中提取 code_verifier 方法中的 authResponse()

$codeVerifier = $request->session()->pull('code_verifier');

然后在将授权代码转换为访问令牌时将 $codeVerifier 添加到 post 方法中的 'code_verifier'

$response = Http::asForm()->post('http://127.0.0.1:9000/oauth/token', [
        'grant_type' => 'authorization_code',
        'client_id' => '1',
        'client_secret' => 'hYMELQ1VKAWrG0TwrkM3JxUuoICSCWCzCztClZZi',
        'redirect_uri' => 'http://127.0.0.1:8000/authorize/response',
        'code' => $request->code,
    ]);

查看关于此的 docs