如何从Laravel Passport 中的Authorization Code Grant 获取授权码?

How to get an authorization code from the Authorization Code Grant in Laravel Passport?

我正在尝试使用授权码授予登录第三方客户端并授予对我的 API 的访问权限。第一步是使用所需参数在 /oauth/authorize 处请求权限。当我这样做时,我收到一个错误响应,说 "Call to a member function getKey() on null" 。我注意到即使没有参数,我也会遇到同样的错误。

authorization code grant permission request

这是我的 web.php 中处理 /redirect 路由的代码。

Route::get('/redirect', function (Request $request) {
    $request->session()->put('state', $state = Str::random(40));
    $query = http_build_query([
        'client_id' => '6',
        'redirect_uri' =>  'http://127.0.0.1:8000/callback',
        'response_type' =>  'code',
        'scope' => '',
        'state' => $state,
    ]);
    return redirect('http://127.0.0.1:8000/oauth/authorize?' . $query);
});

如果我尝试直接向 http://127.0.0.1:8000/oauth/authorize 发出请求,我会收到如下所示的错误响应。

Unsupported grant type

您在第 1 步中发送的请求无效,因为这不是 oauth 流程的工作方式。您实施的流程是一个 3 步过程,用户在浏览器或应用程序中完成以登录您的应用程序并请求允许他们来自的应用程序或网站代表他们访问您的 api .通过 postman post 请求发出请求,您无法访问登录流程,因此它会尝试 return 已认证用户(没有人)的密钥$user->getKey() 不起作用,因为 $user 为空。

对于第二个错误

/oauth/authorize 不接受该授权类型,因为它不 return 授权。 oauth 登录流程有 3 个步骤

  1. 第三方应用将用户重定向到您的服务器进行登录,传递回调url重定向回

  2. 用户登录,您的应用将他们重定向回第三方站点,传回第三方应用用于请求访问令牌的授权码。

  3. 第三方应用程序使用他们在 2 中返回的授权代码向 /oauth/token 发出请求并请求实际访问令牌,然后他们可以使用该令牌访问您的 API代表用户。

因此,您的 Postman 调用 /oauth/authorize 因类型不受支持而失败的原因是您正尝试在 URL 上执行第 3 步到第 2 步。您需要获得授权码在第 2 步中,然后向 /oauth/token 发出请求以获取访问令牌。

如果您尝试向第三方应用程序提供用户身份验证,则需要通过浏览器实现此流程,以便用户有机会通过您的服务器登录。在这种情况下,您的代码片段中的 'redirect_uri' 需要是您从请求中接受的内容,而不是硬编码的内容,因为 URL 是用户在通过您的应用程序进行身份验证后将被重定向回的位置。获得授权码后,您可以在后台进行 REST 调用以获取实际的访问令牌。

如果您尝试纯粹在 REST/API 调用上进行身份验证,那么您必须使用不同的授权类型,很可能是 client credentials grants