gpt4 book ai didi

laravel - 如何在 Laravel 应用程序中获取客户端 ID?

转载 作者:行者123 更新时间:2023-12-03 16:05:09 27 4
gpt4 key购买 nike

我已经设置了一个带有客户端身份验证的 Laravel 应用程序。我将我的客户端 ID 和客户端密码发送给它,它给了我一个 token 。我能够登录到我的 Laravel 应用程序,但我不知道如何获取已授权客户端的 ID。

我已经看到使用提示 auth()->user()->Token()->getAttribute('client_id')获取客户端 ID,但由于我只使用客户端,因此没有用户,并且我收到有关尝试在空对象上调用 Token() 的错误。 Auth::id()也一无所获。我用 Request::header('Authorization') 从标题中获取了 token ,但它与数据库中的任何内容都不匹配。

最佳答案

我假设您正在使用客户端凭据授予 token 和 CheckClientCredentials中间件。

您可以从不记名 token 中获取此信息,但这并不那么简单。您需要使用 token 创建一个新的 PSR7 请求,并将其发送到 oauth 服务器以将其转换为可读数据。

这已经在 CheckClientCredentials 中完成了Passport 提供的中间件。因此,一种方法是扩展 CheckClientCredentials中间件,只需从中间件内部手动设置请求对象上的所需字段。

一、创建app/Http/Middleware/MyCheckClientCredentials.php :

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\AuthenticationException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
use Laravel\Passport\Http\Middleware\CheckClientCredentials;

class MyCheckClientCredentials extends CheckClientCredentials
{
/**
* The Resource Server instance.
*
* @var \League\OAuth2\Server\ResourceServer
*/
private $server;

/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param mixed ...$scopes
* @return mixed
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$scopes)
{
$psr = (new DiactorosFactory)->createRequest($request);

try {
$psr = $this->server->validateAuthenticatedRequest($psr);

// This is the custom line. Set an "oauth_client_id" field on the
// request with the client id determined by the bearer token.
$request['oauth_client_id'] = $psr->getAttribute('oauth_client_id');

} catch (OAuthServerException $e) {
throw new AuthenticationException;
}

$this->validateScopes($psr, $scopes);

return $next($request);
}
}

接下来,更新您的 app/Http/Kernel.php使用您的自定义中间件而不是 Passport 中间件中的构建:
protected $routeMiddleware = [
'client' => \App\Http\Middleware\MyCheckClientCredentials::class,
];

像往常一样将中间件应用于您的路由:
Route::get('/user', function(Request $request) {
// Should show "oauth_client_id" field.
dd($request->all());
})->middleware('client');

如果您不想在中间件中执行此操作,您可以研究 Passport 中间件的工作原理,并根据需要在某种类型的服务中重用此代码。

注意:所有未经测试。

关于laravel - 如何在 Laravel 应用程序中获取客户端 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com