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

3

我正在尝试使用授权码许可来登录第三方客户端并访问我的API。第一步是在/oauth/authorize处请求权限,需要提供必需的参数。当我这样做时,我会收到一个错误响应,显示“调用空值成员函数getKey()”。我注意到即使没有参数,我仍然会收到相同的错误。

授权码许可请求

以下是负责/redirect路由的web.php中的代码:

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发送请求,将会收到下面显示的错误响应:

不支持的授权类型

1个回答

5
在第一步发送的请求不起作用,因为这不是oauth流程的工作方式。你正在实施的流程是一个三步过程,用户完成在浏览器或应用程序中登录到你的应用程序,并请求允许他们来自的应用程序或站点代表他们访问你的api。通过使用postman的post请求进行请求,你无法访问登录流程,因此它尝试返回已经验证的用户的密钥(即没有任何人),因此$user->getKey()不起作用,因为$user为null。
对于第二个错误,/oauth/authorize不接受该授权类型,因为它不返回授权。oauth登录流程有三个步骤。
  1. 第三方应用程序将用户重定向到您的服务器以进行登录,并传递一个回调URL以便重定向回去。

  2. 用户登录后,您的应用程序将其重定向回第三方站点,并传回授权代码,第三方应用程序使用该代码请求访问令牌。

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

因此,您在对/oauth/authorize进行Postman调用时失败的原因是您试图对步骤2的URL执行步骤3。您需要在步骤2中获取授权代码,然后发出请求以获取访问令牌/oauth/token

如果您正在尝试为第三方应用提供用户身份验证,则需要通过浏览器实现此流程,以便用户有机会通过您的服务器进行登录。在这种情况下,代码片段中的'redirect_uri'需要是您从请求中接受的内容,而不是硬编码的内容,因为该URL是用户在使用您的应用程序进行身份验证后将被重定向回去的位置。一旦您拥有了授权代码,您就可以在幕后进行REST调用以获得实际访问令牌。
如果您试图纯粹在REST / API调用上进行身份验证,则必须使用不同的授权类型,最可能是客户端凭据授权

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接