当前位置: 首页 > 知识库问答 >
问题:

Laravel Passport通过访问令牌获取客户端ID

南宫松
2023-03-14

我正在写一个小小的短信网关,供几个项目使用,

我实现了laravel passport身份验证(客户端凭据授予令牌)

然后,我向api中间件组添加了CheckClientCreentials

protected $middlewareGroups = [
    'web' => [
       ...
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
        \Laravel\Passport\Http\Middleware\CheckClientCredentials::class
    ],
];

逻辑工作正常,现在在我的控制器中,我需要让客户机与有效令牌关联。

routes.php

Route::post('/sms', function(Request $request) {
    // save the sms along with the client id and send it

    $client_id = ''; // get the client id somehow

    sendSms($request->text, $request->to, $client_id);
});

出于明显的安全原因,我无法将客户端id与消费者请求一起发送,例如,$client\u id=$request-


共有3个答案

章高朗
2023-03-14

有一个棘手的方法。您可以在中间件CheckClientCredentials中修改句柄的方法,只需添加此行。

        $request["oauth_client_id"] = $psr->getAttribute('oauth_client_id');

然后,您可以在控制器的函数中获取客户端id:

public function info(\Illuminate\Http\Request $request)
{
    var_dump($request->oauth_client_id);
}
西门伟
2023-03-14

然而,答案是相当晚,我得到了一些错误提取Laravel 6. x中的JTI头,因为JTI不再是在头,但只在有效载荷/索赔。(使用客户赠款)

local.ERROR: Requested header is not configured {"exception":"[object] (OutOfBoundsException(code: 0): Requested header is not configured at /..somewhere/vendor/lcobucci/jwt/src/Token.php:112)

另外,在中间件中添加它对我来说不是一个选择。因为我需要它在我的应用程序的几个地方。

所以我扩展了原来的Laravel Passport Client(oauth_clients)模型。检查报头和有效载荷。允许传递请求,或者在没有传递请求的情况下使用请求外观。

<?php

namespace App\Models;

use Illuminate\Support\Facades\Request as RequestFacade;
use Illuminate\Http\Request;
use Laravel\Passport\Client;
use Laravel\Passport\Token;
use Lcobucci\JWT\Parser;

class OAuthClient extends Client
{
    public static function findByRequest(?Request $request = null) : ?OAuthClient
    {
        $bearerToken = $request !== null ? $request->bearerToken() : RequestFacade::bearerToken();

        $parsedJwt = (new Parser())->parse($bearerToken);

        if ($parsedJwt->hasHeader('jti')) {
            $tokenId = $parsedJwt->getHeader('jti');
        } elseif ($parsedJwt->hasClaim('jti')) {
            $tokenId = $parsedJwt->getClaim('jti');
        } else {
            Log::error('Invalid JWT token, Unable to find JTI header');
            return null;
        }

        $clientId = Token::find($tokenId)->client->id;

        return (new static)->findOrFail($clientId);
    }
}

现在,您可以在laravel应用程序中的任何位置使用它,如下所示:

如果有$request对象可用(例如从控制器)

$client = OAuthClient::findByRequest($request);

或者即使请求以某种方式不可用,您也可以在没有以下内容的情况下使用它:

$client = OAuthClient::findByRequest();

希望这对今天面对这个问题的任何人都有用。

霍永年
2023-03-14

我使用它来访问经过身份验证的客户端应用程序。。。

$bearerToken = $request->bearerToken();
$tokenId = (new \Lcobucci\JWT\Parser())->parse($bearerToken)->getHeader('jti');
$client = \Laravel\Passport\Token::find($tokenId)->client;

$client_id = $client->id;
$client_secret = $client->secret;

来源

 类似资料:
  • 需要使用passport为laravel构建api系统。在拉威尔。2 Oauth 2集成有一个单独的类授权程序,用于执行通过访问令牌获取用户数据的操作方式 但在passport中,没有基于访问令牌获取用户详细信息的单独方法。有人能帮我吗?

  • 我如何为我自己的用户获取Spotify访问令牌,而不是从Postman处获取? 我想使用邮递员从Spotify获取访问令牌(无需之前的手动登录)。 如果这很复杂,我会接受先手动登录,然后再从Postman获取令牌。 < li >要获得访问令牌(将在我自己的Postman请求中进一步使用),我必须在登录Spotify开发者网站时手动获得一个。 因此,我想直接从Postman获得它,在那里我可以立即在

  • 我在这里有点迷路,需要一些直接的请。我是新来Java,这是我试图写的第一个程序,显然与它斗争了一个月左右。因此,目前我们使用邮递员输入客户端ID/秘密从第三方应用编程接口获得访问令牌,使用该令牌我们可以从第三方的另一个终端请求资源。我正在尝试引用多个资源,如此Spring安全示例https://github.com/spring-projects/spring-security/blob/mast

  • 我有一个关于Keycloak和获取访问令牌的问题。 我们的设置如下:·用户在Keycloak中创建和维护。资源、策略和权限也在Keycloak中维护 >我们如何通过只知道用户名来为用户获取访问令牌? >有没有为这样的用户获取访问令牌的解决方案?

  • 获取访问令牌的文档中的第一步是“将用户引导到我们的授权URL”。那到底是什么意思?没有提供链接或任何东西。它还说“公司名称、联系电子邮件和隐私政策URL是开始提交的必要条件。”我们的应用程序没有隐私政策...只是一个简单的标签提要。我不明白为什么有一个简单的标签提要那么复杂。 是否有一个等待时间来获得批准的应用程序..如果它得到批准...在获得访问令牌之前,我必须获得批准吗?这在任何地方都没有概述