Jwt是高效简单的接口验证组件,使用非常广泛。
GitHub:https://github.com/tymondesigns/jwt-auth
安装
composer安装
composer require tymon/jwt-auth:1.0.0
生成配置文件
php artisan vendor:publish
生成密钥
这是用来给你的token签名的钥匙,使用以下命令生成一个密钥:
php artisan jwt:secret
这将用 JWT_SECRET=foobar
更新.env文件
配置说明
JWT配置文件是 config/jwt.php
,下面有部分配置项进行说明:
#令牌过期时间(单位分钟),设置null为永不过期
'ttl' => env('JWT_TTL', 60)
#刷新令牌时间(单位分钟),设置为null可永久随时刷新
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160)
修改用户模型
首先,您需要在用户模型上实现 Tymon\JWTAuth\Contracts\JWTSubject
契约,它要求您实现两个方法 getJWTIdentifier()
和 getJWTCustomClaims()
。
下面的示例应该能让您了解这可能是什么样子的。显然,您应该根据需要进行任何更改,以满足自己的需要。
<?php
namespace App;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
{
use Notifiable;
/**
* 获取将存储在JWT主题声明中的标识符.
* 就是用户表主键 id
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
}
/**
* 返回一个键值数组,其中包含要添加到JWT的任何自定义声明.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
}
配置验证守卫
修改 config/auth.php
文件以使用jwt保护来为接口身份验证提供支持。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
]
修改dingo配置文件 config/api.php
文件中的身份验证提供者
'auth' => [
'jwt' => \Dingo\Api\Auth\Provider\JWT::class,
],
验证操作
路由定义
$api = app(\Dingo\Api\Routing\Router::class);
$api->version('v1', ['namespace' => 'App\Http\Controllers\Api',], function ($api) {
$api->post('login', 'AuthController@login');
$api->get('logout', 'AuthController@logout');
$api->get('me', 'AuthController@me');
});
控制器定义
class AuthController extends Controller
{
public function __construct()
{
// 除login外都需要验证
$this->middleware('auth:api', ['except' => ['login']]);
}
//登录获取token
public function login()
{
$credentials = request(['email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return $this->response->errorUnauthorized('帐号或密码错误');
}
return $this->respondWithToken($token);
}
//获取用户资料
public function me()
{
return response()->json(auth('api')->user());
}
//销毁token
public function logout()
{
auth('api')->logout();
return response()->json(['message' => 'Successfully logged out']);
}
//刷新token
public function refresh()
{
return $this->respondWithToken(auth('api')->refresh());
}
//响应token
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60,
]);
}
}
使用令牌
当请求需要验证的api时必须带有token,下面是使用header头携带令牌数据
Authorization: Bearer 令牌数据
还不快抢沙发