【问题标题】:Laravel Passport - oauth/token gives Client authentication failedLaravel Passport - oauth/token 给客户端身份验证失败
【发布时间】:2021-08-15 00:06:50
【问题描述】:

我已经安装了 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

知道可能是什么问题,我该如何解决?

【问题讨论】:

    标签: php laravel oauth-2.0 laravel-passport


    【解决方案1】:

    您缺少在您的 authResponse() 方法上从会话中提取 code_verifier

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

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

    $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 的相关信息。

    【讨论】:

    • code_verifier 来自哪里?
    • @Venelin 来自 auth() 方法,当您进行会话时。
    猜你喜欢
    • 2020-08-17
    • 2019-06-27
    • 2019-01-08
    • 2016-02-22
    • 2015-04-27
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多