Laravel 使用 Passport 进行API认证

曾经使用过Dingo + JWT来作API系统,工做起来还好,就是配置比较麻烦。如今使用官方扩展包来尝试下。php

首先安装 Laravel/Passport,这里再也不重复,直接参考官方文档。前端

https://laravel.com/docs/5.6/passport
laravel

在文档里有一步是json

php artisan passport:client

这一步会产生两个client id,其中client id 2能够不用走完整的OAuth2流程,直接用用户名和密码就能认证。api

请求形式以下:post

$response = $http->post('http://localhost:9001/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => '2',
        'client_secret' => 'QLA0JWeQB1zWBTDrzhody6o5OTmjHDfsx2vNiOfI',
        'username' => 'name@email.com',
        'password' => 'abcd1234',
        'scope' => '',
    ],
]);

这段代码的意思是:spa

1,请求地址是 http://localhost:9001/oauth/token ,这个域名就是你本身的域名,/oauth/token是passport已经设置好了的。code

2,grant_type 要设为password,代表直接用账号来验证orm

3,client_id 和client_secret 这两就是系统里生成的client信息。在oauth_clients表中能够查到,默认生成的第2个就是password形式。router

几乎不用作什么额外配置就能够完成认证了。

Postman中以下:



补充一点:

laravel默认在router/api.php里定义了一条路由,使用auth:api中间件来检查是否已经认证。

若是直接访问这个路由,好比  http://127.0.0.1/api/user, 没有认证的状况下,它会显示登陆页的信息,(以前作了make:auth,没作这一操做的返回结果尚不清楚),显然这个对api客户端来讲不友好,应该返回json格式的错误信息才对。

这里只要在客户端的请求头中加上" X-Requested-With = XMLHttpRequest " 这个请求头,就会返回正常的json格式消息。


这种认证形式适合js页面,或是移动端程序来进行用户认证,简单明了,不用走oauth2的所有流程。

对于第三方受权的应用场景仍是走完整流程比较好,不要因小失大。


忘了个事,对于client id 和secret的信息,可能不但愿放到前端去,那么能够自定义个路由,作个中转。

Route::get('/auth/password', function (\Illuminate\Http\Request $request){
    $http = new \GuzzleHttp\Client();

    $response = $http->post('http://localhost:9001/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => '2',
            'client_secret' => 'QLA0JWeQB1zWBTDrzhody6o5OTmjHDfsx2vNiOfI',
            'username' => $request->input('username'),
            'password' => $request->input('password'),
            'scope' => '',
        ],
    ]);

    return json_decode((string)$response->getBody(), true);
});

这里的 client_id client_secret也能够写到.env里去。这样对用户client信息就是不可见的。不用前端保存client信息。


-完-