我正在尝试使用授权代码授权来登录第三方客户端并访问我的API。第一步是使用所需的参数请求/oauth/authorize的权限。当我这样做时,我会得到一个错误响应,上面写着“调用null上的成员函数getKey()”。我注意到即使没有参数,也会出现同样的错误。
这是我的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发出请求,我将得到如下所示的错误响应。
发布于 2019-10-31 14:10:55
您在步骤1中发送的请求不起作用,因为oauth流不是这样工作的。您的实现流程是一个3步流程,用户可以在浏览器或应用程序中完成该流程,以登录到您的应用程序,并请求允许他们来自的应用程序或站点代表他们访问您的api。通过通过postman post请求进行请求,您无法访问登录流,因此它试图为已经创建的用户(没有人)返回一个键,因此$user->getKey()无法工作,因为$user为null。
对于第二个错误
/oauth/authorize不接受该授予类型,因为它不返回授权。oauth登录流有3个步骤
/oauth/token发出请求并请求一个实际的访问令牌,然后他们可以使用该令牌代表用户访问您的API。因此,您的邮递员调用/oauth/authorize失败的原因是,您试图在步骤2的URL上执行步骤3。您需要在步骤2中获得授权代码,然后向/oauth/token发出请求以获得访问令牌。
如果您试图向第三方应用程序提供用户身份验证,那么您需要通过浏览器实现这个流程,这样用户就有机会通过您的服务器登录。在这种情况下,代码段中的“redirect_uri”必须是从请求中获取的东西,而不是硬编码的东西,因为在通过应用程序进行身份验证后,用户将被重定向到那里。一旦有了auth代码,就可以在幕后进行REST调用,以获得实际的访问令牌。
如果您试图完全在REST/API调用上进行身份验证,那么您必须使用不同的授予类型,很可能是客户凭据授予。
https://stackoverflow.com/questions/58642227
复制相似问题