Laravel Passport快速实现API认证
Laravel Passport快速实现API认证
安装拓展 passport
首先为什么要使用passport 拓展?
思考:API 认证如果是网页端使用session 会话保持就可以简单做到,但是如果是app端无会话保持的情况下,就只能想其他办法了,其中一个就是:api 令牌。
如何解决这个问题呢?
思考:用户通过 API 登录时,会生成令牌并将其发送给用户,该用户可用于身份验证,也就是app端提交请求时,头信息里必须添加api token, 如下:$accessToken 为用户登录后生成的令牌
‘headers’ => [
‘Accept’ => ‘application/json’,
‘Authorization’ => 'Bearer '. $accessToken,
]
思路明确后,撸起袖子就干。
- 前提是你已经创建了laravel 项目;
安装passport 拓展:
composer require laravel/passport
愉快的等待中…
passport 拓展配置
添加服务提供者
现在我们需要在 config/app.php 文件中为Passport注册服务,添加如下:
'providers' => [
....
Laravel\Passport\PassportServiceProvider::class,
]
执行数据迁移
php artisan migrate
安装拓展
php artisan passport:install
添加用户表API TOKEN 支持
修改我们的用户模型代码
use Laravel\Passport\HasApiTokens;
/**
* Class Administrator.
*
* @property Role[] $roles
*/
class Administrator extends Model implements AuthenticatableContract
{
use Authenticatable;
use HasPermissions;
use DefaultDatetimeFormat;
use HasApiTokens; // 添加这行代码
以上是我的部分代码(我的是使用了laravel-admin 的用户表,你的可能是这样):
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
配置auth service 提供者支持passport 路由
在我们的 AuthServiceProvider 的引导方法中添加 Passport :: routes() 方法。 用来生成必要的路由。 下面是 app/Providers/AuthServiceProvider.php 改完后的部分代码:
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
修改api 认证驱动
在 config/auth.php 中找到如下代码,并修改为:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport', // 修改驱动为passport
'provider' => 'users'
],
],
代码实现
添加登录验证控制器
下面就要开始实现登录验证接口了,
php artisan make:controller PassportController
然后代码实现如下:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PassportController extends Controller
{
/**
* Handles Login Request
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function login(Request $request)
{
$credentials = [
'username' => $request->username,
'password' => $request->password
];
if (auth()->attempt($credentials)) {
// 生成用户访问令牌,'AsYouLike'是你自己定义的字符串
$token = auth()->user()->createToken('AsYouLike')->accessToken;
// 获取用户的所有权限
$permissions = auth()->user()->permissions;
// 把token 返回给客户端
return response()->json(['code' => 200, 'token' => $token, 'permissions' => $permissions], 200);
} else {
return response()->json(['error' => 'UnAuthorised'], 401);
}
}
}
代码应该都看得懂,关键地方已经加注释
添加登录认证路由
在routes/api.php 中添加相关路由:
// 不需要登录接口
Route::group([
'prefix' => '/v1',
'namespace' => '\App\Http\Controllers',
'middleware' => 'api'
], function (\Illuminate\Routing\Router $router) {
// 登录接口路由
$router->post('/user/login', 'PassportController@login');
});
// 需要登录后的接口
Route::group([
'prefix' => '/v1',
'namespace' => '\App\Http\Controllers\Api',
'middleware' => 'auth:api'
], function (\Illuminate\Routing\Router $router) {
$router->resource('hotels', HotelController::class);
});
测试结果
登录验证接口测试
需要登录才能访问的接口测试
-
不提交token 信息或者错误信息时,提示无权限
-
正确提交token后,成功查询
那么如此就轻松搞定了api token 验证了