如何在Laravel应用中获取客户端ID?

卡利弗

我已经设置了带有客户端身份验证的laravel应用。我将我的客户ID和客户机密发送给它,并给了我一个令牌。我可以登录到laravel应用程序,但无法弄清楚如何获取已授权的客户端的ID。

我已经看到了用于auth()->user()->Token()->getAttribute('client_id')获取客户端ID的提示,但是由于仅使用客户端,因此没有用户,并且在尝试对空对象调用Token()时出现错误。Auth::id()也什么也没返回。我用头从标头中获取了令牌Request::header('Authorization'),但它与数据库中的任何内容都不匹配。

爱国者

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

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

这已经在CheckClientCredentialsPassport提供中间件中完成了因此,一种方法是扩展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中间件的工作方式,并根据需要在某些类型的服务中重用此代码。

注意:所有未经测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在客户端获取会话ID?(WebSocket)

如何在iOS客户端的Youtube API中获取“客户端机密”?

如何在keycloak中获取客户端的id(不是clientId)?

如何在Instagram API中获取客户端ID和访问令牌?

如何在Laravel 5+中获取客户端IP地址

如何在iOS中存储客户端ID /客户端密钥字符串

如何在WebRequest中获取客户端的远程地址

如何在Roda中获取客户端的IP地址?

如何在启动文件中获取客户端对象?

如何在RestEasy客户端中获取响应头?

如何在ssh会话中获取客户端ip?

如何在Laravel中设置OpenID Connect客户端?

如何在next.js应用程序中从服务器端获取客户端的IP地址?

如何从应用程序(客户端)ID和目录(租户)ID获取对象ID?

包含访问令牌时,如何从客户端应用程序中的IdentityServer获取用户ID?

旧的客户端密钥在 Azure 应用程序中过期后,如何获取新的客户端密钥?

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

在重定向到客户端之前,如何在身份服务器中获取id_token?

Laravel Passport - 通过客户端 ID 获取客户端密码

Azure Pipeline 在脚本中获取应用程序客户端 ID

如何在blazor服务器应用中使用signalr从http客户端获取令牌?

如何在本机应用程序上存储OAuth客户端ID

如何在客户端Java应用程序中使用客户端证书?

如何在服务器端从express / mongo / mongoose中的URL获取参数ID,在客户端实现axios / react / redux中的URL

如何从 Django 请求中获取 oauth2 客户端应用程序

我如何让我的快递服务器从我的React客户端应用中获取请求?

如何从 Angular 应用程序中的 http 客户端获取嵌套的 [object Object] 数据?

如何在ElasticSearch和ElasticSearch Javascript客户端中按ID和ID查找

如何在Flutter应用中使用WebSocket客户端?