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

如何使用Laravel Passport Scopes密码授权类型限制用户操作

和季
2023-03-14

我已经为Laravel 5.3设置了Laravel Passport包,正如官方文档中所述(https://laravel.com/docs/5.3/passport#introduction).

我希望移动应用程序使用API,因此我尝试实现密码授予令牌。我已经创建了一个密码授予客户端,令牌请求过程。。。

$response = $http->post('http://my-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => 'my@email.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

...正如预期的那样,为我的一个用户返回一个访问令牌和一个刷新令牌。

但是现在我想定义一些范围,这样我就可以限制用户的访问...在留档之后,我在AuthServiceP的引导方法中定义了它们rovider.php如下:

Passport::tokensCan([
    'admin' => 'Perform every action',
    'user' => 'Perform only normal user actions',
]);

在这种情况下,如果“恶意”普通用户请求令牌(使用上述POST调用)指定“范围”=

因此,我想知道在这种情况下工作流如何有效地限制正常用户的访问,以及我必须在哪里实现范围验证逻辑。

提前感谢。


共有3个答案

皇甫飞宇
2023-03-14

我忘了我在哪里读到过,某个地方有一些Github问题,但是很明显Laravel没有内置的能力,每个客户端都是一样的,开箱即用。

一位用户提供了一个很好的解决方案,我在这里以此为基础:https://stackoverflow.com/a/55285483/1132557

钮兴安
2023-03-14

在我看来,我认为让大多数人对OAuth和API感到困惑的是,作用域与“客户机”绑定,而不是“资源所有者”本身。如果需要,客户端应该能够使用管理作用域或根本不使用作用域与API对话。如果他们将admin-ish类型的作用域与用户上下文(密码授权、授权码授权等)一起使用,那么就无法阻止他们在API中对该用户进行需要此类作用域的调用。对我来说,唯一一个真正可以被归类为恶意的人是那些设法窃取包含管理范围的访问令牌的人。这就是为什么允许API实现者指定授予客户机的作用域,如果它是使用类似密码授予的第一方应用程序,那么作为用户,您别无选择,只能信任它和您的数据

我不知道一个人会如何做到这一点,并在另一个人的移动应用程序中使用检索到的令牌,但如果你真的尝试用管理范围手动请求令牌,那么我真的看不出有什么错(除了你给你的应用程序更多的控制权设置为用户上下文,所以它甚至可能会适得其反?(

如果您需要更多的控制,那么您需要超越您的API,为资源服务器中的每个用户创建类似应用程序级权限的东西。

程振濂
2023-03-14
匿名用户

一种方法是创建一个中间件

例如,如果您只希望用户使用来自示例的电子邮件。com请求管理域,您可以执行以下操作

示例ScopeLogic。php中间件:

if ($request->input('grant_type') === 'password') {
    $scope = $request->input('scope');
    $username = $request->input('username');

    if ($scope === 'admin' && (strpos($username, '@example.com') === false)) {
        return response()->json(['message' => "Not authorized to request admin scope"], 401);
    }
}

return $next($request);

当然,您必须将这个作用域添加到内核中的$routeMiddleware数组中。php

protected $routeMiddleware = [
    ...
    'check-scopes' => \App\Http\Middleware\ScopeLogic::class
]

以及包装护照::路由()在AuthServiceProvider.php来检查这个中间件

\Route::group(['middleware' => 'check-scopes'], function() {
    Passport::routes();
});

Passport还将检查是否传递了正确的用户名和Passport组合,这样您就不必在中间件中担心这一点

 类似资料:
  • 我希望能够对客户机进行身份验证/授权,以产生/消费某些主题的消息。它们将是我们vpn的一部分(包括aws)。根据我对可用文档的理解,唯一的选择是颁发客户端证书并基于客户端DNS设置ACL?不幸的是,我不能使用我的私人CA(我在linux笔记本电脑上创建的)来创建客户端证书。于是出现了以下问题: null 请开导我:) 提前谢谢marcel

  • 我正在尝试制作一个使用数据库的java应用程序。我已经下载了db2并创建了一个用户'student'。我的程序中有以下几行: 显然,我几乎不知道我在做什么,我不知道如何给予“学生”必要的特权。也就是说,我不知道什么用户可以给他特权,因为我从来没有创建过另一个用户。我看到有人提到过'db2admin'(我使用的是windows),但我不知道该如何处理这段信息。我不知道如何检查现有用户,也不知道对db

  • 登录时我总是得到无效的授权类型。我使用的是Laravel 7和passport 8.4。 我可以确认,我创建的client_secret没有错误运行php artisan护照:安装,但我找不到任何可能性,为什么获取访问令牌和刷新令牌不工作。 我使用自定义用户提供商,正确地设置在配置,我注意到如果我改变grant_typeclient_credentials它将只是工作,但没有刷新令牌,我想要什么。

  • 我想让我的用户注册一个唯一的用户名和密码(而不是电子邮件密码)。我的一切都在工作,我: 报名啦 > 用户 Q Z q F zW xp d Mfc 0 x my Iq 5 IDAr 1 bz r 2 凭据 电子邮件:myemail@gmail.com 用户名:“MyUsername” 凭据 电子邮件:another@gmail.com 用户名:"另一个 登录 查询数据库以获取与用户名关联的用户,并使

  • Using a delegation key The collaborator can now push to the repository using Docker Content Trust. Docker will automatically choose and pick the right key for the targets/release role. Edit the file o

  • 产品-服务:具有受保护路由的简单下游服务 jwt-resoure-server:当包含在下游服务中时,使其成为提取jwt令牌并将其设置在安全contex中的资源服务器的jar。 尤里卡-服务:发现服务 zuul-server:边缘服务器 Okta是我的auth服务器 我已经将oauth grant类型设置为be-Authorization code(我知道对于spa来说,建议使用隐式grant类型