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

时间:2019-10-31 11:18:28

标签: php laravel oauth oauth-2.0 laravel-passport

我正在尝试使用授权码授予来登录第三方客户端并授予对我的API的访问权限。第一步是在/ oauth / authorize处使用所需参数请求权限。当我这样做时,我收到一个错误响应,提示“在null上调用成员函数getKey()”。我注意到即使没有参数,我也会遇到同样的错误。

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 个答案:

答案 0 :(得分:0)

您在第1步中发送的请求无效,因为这不是oauth流程的工作方式。您实施的流程是一个三步过程,用户在浏览器或应用程序中完成该过程以登录到您的应用程序,并请求允许其所来自的应用程序或网站代表他们访问您的api。通过邮递员发布请求提出请求,您将无法访问登录流程,因此它将尝试为已通过身份验证的用户(没有人)返回密钥,因此$user->getKey()不起作用,因为{{1 }} 一片空白。

第二个错误

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

  1. 第三方应用程序将用户重定向到您的服务器以登录,并传递回调网址以重定向回

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

  3. 第三方应用使用他们在2中返回的授权代码向$user发出请求,并请求一个实际的访问令牌,然后他们可以用来代表用户访问您的API。

因此您的Postman呼叫/oauth/authorize失败的原因是类型不受支持,原因是您尝试对步骤2的URL执行步骤3。您需要在步骤2中获得授权代码,然后进行向/oauth/authorize请求以获取访问令牌。

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

如果您尝试仅通过REST / API调用进行身份验证,则必须使用其他授权类型,最有可能是client credentials grants