【问题标题】:Retrieving Client Credentials grant token returns 401 Unauthorized检索客户端凭据授予令牌返回 401 Unauthorized
【发布时间】:2021-07-05 03:45:43
【问题描述】:

我正在设置 Laravel Passport 的客户端授权并使用 Guzzle 检索令牌,但我收到 401 Unauthorized 错误。

我使用:php artisan passport:client --client 创建了客户端。 生成的客户端是:

Client ID: 1
Client secret: NmJsEVFClXVqWJuQnZTWA3bnZEVZ0KaC13anHZt1

我将这些保存在我的 .env 文件中并运行了命令

php artisan config:clear

这是我的代码:

        $url = 'http://hub.local/oauth/token';

        $client_secret = env('CLIENT_SECRET');
        $client_id = env('CLIENT_ID');
        $client = new Client();

        try {
            $response = $client->post($url, [
                'json' => [
                    'grant_type' => 'client_credentials',
                    'client_id' => $client_id,
                    'client_secret' => $client_secret,
                ],
                'headers' => [
                    'Content-Type' => 'application/json',
                ],
            ]);
            return $response;
        } catch (RequestException $e) {
            dd($e);
        } catch (Exception $e) {
            dd($e);
        }

以及由此产生的错误信息:

ClientException {#660 ▼
  -request: Request {#649 ▶}
  -response: Response {#657 ▶}
  -handlerContext: []
  #message: """
    Client error: `POST http://hub.local/oauth/token` resulted in a `401 Unauthorized` response:
    {"error":"invalid_client","error_description":"Client authentication failed","message":"Client authentication failed"}
    """
  #code: 401
  #file: "C:\repos\client\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php"
  #line: 113

当我在 Insomnia 中使用相同的参数和值尝试请求时,请求有效。 好像还不能发图。 https://i.imgur.com/w6Ollin.jpg https://imgur.com/fXpzKjj.jpg

我正在使用 Laravel 5.8.12、Guzzle 6.3.3 和 Passport 7.2.2。 我错过了什么?

【问题讨论】:

  • 请不要在此处发布密码或 API 令牌(客户端机密)!
  • @PowerStat 感谢您的提醒。我知道发布身份验证凭据的危险,但这是一个用于测试的本地实例,我想避免担心我是否在请求中使用了正确的客户端密码。在阅读与该主题相关的其他问题时,在某些情况下这是一个错误,所以这只是我提前表明这对我来说不是一个可能的错误来源。干杯。

标签: laravel oauth-2.0 laravel-passport


【解决方案1】:

更新:仅当我在同一个本地 xampp 服务器上运行 (Laravel) 客户端和服务器实例时才会出现此问题。我将它们分开以在各自的 xampp 实例上运行,并且身份验证没有问题。仅在本地测试时让我感到困惑的是,该请求适用于 Insomnia,但不适用于浏览器。我假设这个客户端授权的“机器对机器”部分看到我的客户端+服务器共享相同的 xampp 实例作为无法识别的东西。无论如何,没有实际问题。希望这对其他人有帮助。

【讨论】:

    【解决方案2】:

    在 laravel 文档中有一个这样的例子:

    Route::get('/callback', function (Request $request) {
        $http = new GuzzleHttp\Client;
    
        $response = $http->post('http://your-app.com/oauth/token', [
            'form_params' => [
                'grant_type' => 'authorization_code',
                'client_id' => 'client-id',
                'client_secret' => 'client-secret',
                'redirect_uri' => 'http://example.com/callback',
                'code' => $request->code,
            ],
        ]);
    
        return json_decode((string) $response->getBody(), true);
    });
    

    当我用我的信息测试这个时,我变成了这样的东西:

    Route::get('/users/login', function (Request $request) {
        $http = new GuzzleHttp\Client;
    
        $response = $http->post('http://payment.devenv/oauth/token', [
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => 2,
                'client_secret' => 'z8YWlJeaW0d7o7SFyPLISUxYOcO5CxjGrZ5YuItl',
                'username' => 'athamidn@gmail.com',
                'password' => '123456',
                'scope' => '',
                'code' => 200,
                'redirect_uri' => 'http://example.com/callback',
            ],
        ]);
        return json_decode((string) $response->getBody(), true);
    });
    

    我收到了与您的错误相同的错误。几个小时后,我遇到了问题:

    在 oauth_clients 表的数据库中,这是我的信息:

    2 name: Laravel Password Grant Client redirect: http://localhost
    

    当我将重定向 url 更改为此它时,它可以工作。 最后:

    Route::get('/users/login', function (Request $request) {
        $http = new GuzzleHttp\Client;
    
        $response = $http->post('http://payment.devenv/oauth/token', [
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => 2,
                'client_secret' => 'z8YWlJeaW0d7o7SFyPLISUxYOcO5CxjGrZ5YuItl',
                'username' => 'athamidn@gmail.com',
                'password' => '123456',
                'scope' => '',
                'code' => 200,
                'redirect_uri' => 'http://localhost'
            ],
        ]);
        return json_decode((string) $response->getBody(), true);
    });
    

    【讨论】:

    • 我整天都遇到同样的问题。后来当我做 php artisan clear cache 它得到解决
    【解决方案3】:

    我相信您可以通过执行php artisan passport:install 重新创建存储在/storage 文件夹中的护照公钥和私钥。然后您可以在.env 文件中定义这些键并使用client_idclient_secret 传递它。

    command output
    Personal access client created successfully.
    Client ID: 31
    Client secret: xxxx
    Password grant client created successfully.
    Client ID: 32
    Client secret: xxxx
    
    /.env
    PERSONAL_CLIENT_ID=31
    PERSONAL_CLIENT_SECRET=xxxx
    PASSWORD_CLIENT_ID=32
    PASSWORD_CLIENT_SECRET=xxxx
    
    POST - API parameters - /oauth/token
    'client_id' => env('PASSWORD_CLIENT_ID'),
    'client_secret' => env('PASSWORD_CLIENT_SECRET')
    

    当这些私钥和公钥与已创建的密钥不正确匹配时,可能会发生此错误。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 2020-02-25
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2015-04-16
      相关资源
      最近更新 更多