客户端凭证令牌的授权方式不需要走典型的登录或授权重定向流程,适用于后端与后端应用之间的接口认证,类似做微信、支付宝开放平台开发,需要先申请自己的应用,申请通过后,这些开放平台会给开发者分配对应的 APP ID 和 APP SECRET。然后开发者通过这个 APP ID 和 APP SECRET 去开放平台获取 Token(令牌),最后拿着这个令牌去访问认证资源即可。客户端凭证令牌也是这个思路。
以测试项目 testapp
作为客户端应用,把后端项目 blog
作为类似微信、支付宝的开放平台。
在开放平台注册客户端应用
在开放平台 blog
中注册对应的客户端应用 testapp
,在 blog
项目根目录下运行以下命令来注册 testapp
:
php artisan passport:client
>
> testapp
> http://app.test/auth/callback
# 显示结果
CLIENT_ID=11
CLIENT_SECRET=XKmtGXC1CdG2LvhUpdp3y81IjuyrP0rLUPPq8reg
在客户端应用中定义路由和控制器
在客户端应用中定义获取令牌的路由,在 routes/web.php
新增下面行代码:
Route::get('/auth/client', 'Auth\LoginController@client');
然后在 LoginController
控制器中编写对应的 client
方法:
public function client()
{
$http = new Client();
$response = $http->post('http://blog.test/oauth/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => 11, // your client id
'client_secret' => 'XKmtGXC1CdG2LvhUpdp3y81IjuyrP0rLUPPq8reg', // your client secret
'scope' => '*'
],
]);
return response($response->getBody());
}
测试客户端应用访问开放平台认证接口
在浏览器中访问 http://app.test/auth/client
,就可以获取到访问令牌了。
客户端访问令牌默认长期有效,所以没有返回用于刷新令牌的 refresh_token
字段。
可以通过将返回的 access_token
值添加到 Bearer Authentication 请求头中,来访问开放平台 blog
中需要认证的 API 接口了。
在后端应用的 routes/api.php
中新增一个测试路由:
Route::middleware('client')->get('/test', function (Request $request) {
return '欢迎访问后端应用!';
});
在这个路由中应用了 client
中间件,表示该路由需要通过客户端凭证访问令牌进行认证才能访问。
接下来,在 app/Http/Kernel.php
的 $routeMiddleware
属性中定义这个中间件:
'client' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
在 Postman 中测试这个 API 接口的访问,将上述 /auth/client
请求返回的 access_token
值添加到 Bearer Token 请求头中,就可以获取到对应的接口返回数据了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。