乐趣区

关于lavarel:Laravel-通过-Passport-实现-API-请求认证令牌作用域详解

配置后端利用

在后端利用 blog 中通过 Passport::tokensCan 定义 API 认证的令牌作用域。关上 AuthServiceProvider 服务提供者类,在 boot 办法中调用该办法,设置三个令牌作用域:

// 令牌作用域
Passport::tokensCan([
    'basic-user-info' => '获取用户名、邮箱信息',
    'all-user-info' => '获取用户所有信息',
    'get-post-info' => '获取文章详细信息',
]);

关上 app/Http/Kernel.php,在 $routeMiddleware 属性中引入两个中间件:

'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,

scopes 用于查看传入令牌作用域是否蕴含所有指定中间件参数,scope 用于查看传入令牌作用域是否蕴含任意指定中间件参数。

routes/api.php 中新增一个获取文章详情信息的路由,并批改路由定义如下:

Route::middleware('auth:api')->group(function () {Route::get('/user', function (Request $request) {$user = $request->user();
        if ($user->tokenCan('all-user-info')) {
            // 如果用户令牌有获取所有信息权限,返回所有用户字段
            return $user;
        }
        // 否则返回用户名和邮箱等根本信息
        return ['name' => $user->name, 'email' => $user->email];
    })->middleware('scope:basic-user-info,all-user-info');
    
    Route::get('/post/{id}', function (Request $request, $id) {return \App\Post::find($id);
    })->middleware('scopes:get-post-info');
});

第一个路由利用了 scope 中间件,要求传入令牌作用域蕴含 basic-user-infoall-user-info 任意一个即可,并且在路由闭包中依据用户具体字段获取权限进一步进行了细分;

第二个路由利用了 scopes 中间件,要求传入令牌作用域必须蕴含 get-post-info,如果有多个的话,能够通过逗号分隔。

在第三方利用中测试

在第三方利用 testapp,将配置信息批改回受权码令牌对应配置,而后在 /auth 路由对应控制器办法 LoginController@oauth 中,设置 scope 申请字段值:

public function oauth()
{
    $query = http_build_query(['client_id' => config('services.blog.appid'),
        'redirect_uri' => config('services.blog.callback'),
        'response_type' => 'code',
        'scope' => 'all-user-info get-post-info',
    ]);

    return redirect('http://blog.test/oauth/authorize?'.$query);
}

在本例中,为了简化解决流程,间接在第三方利用控制器办法中写死了作用域,理论场景中能够让用户自行勾选,而后通过表单传递到控制器办法。

在浏览器中拜访 http://test.app/auth 通过受权码获取令牌,跳转到后端系统受权界面时会多出一段提示信息告知该受权令牌的作用域。

点击绿色的确认受权按钮后,就可在第三方利用中获取到受权令牌,与此同时,也会在后端利用数据表 oauth_access_tokensoauth_auth_codes 生成的记录看到对应的 scopes 字段值。

接下来,能够通过获得的 access_token 在 Postman 中测试对后端认证接口的拜访。

申请 /api/user/api/post/1 都胜利了。


把第三方利用 /auth 路由传递的 scope 申请字段值调整为了 basic-user-info

public function oauth()
{

    $query = http_build_query(['client_id' => config('services.blog.appid'),
        'redirect_uri' => config('services.blog.callback'),
        'response_type' => 'code',
        'scope' => 'basic-user-info',
    ]);

    return redirect('http://blog.test/oauth/authorize?'.$query);
}

再次通过 http://test.app/auth 获取令牌,令牌作用域就会发生变化。

确认受权之后,会获取到新的令牌信息,而后应用这个令牌拜访用户接口,就只能取到最根本的用户字段信息,试图拜访文章详情接口,则会返回 403 响应。

结语

通常会在 scope 字段传入 *(或留空,每种令牌认证有所不同)示意获取到的令牌具备所有认证接口拜访权限,但如果对安全性要求比拟高的零碎,则能够通过令牌作用域的形式对令牌拜访权限做更细分的设置,通过 Passport 内置的脚手架,能够疾速实现令牌作用域性能,十分不便。

退出移动版