曾经使用过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信息。
-完-