laravel版本为5.5
1、使用 composer 安装
composer require tymon/jwt-auth 1.*@rc
2、发布配置文件
# 这条命令会在 config 下增加一个 jwt.php 的配置文件 php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
3、生成加密密钥
# 这条命令会在 .env 文件下生成一个加密密钥,如:JWT_SECRET=foobar php artisan jwt:secret
4、更新你的模型(此处 使用的是laravel的user模型)
1 <?php 2 3 namespace App\Models; 4 5 use Tymon\JWTAuth\Contracts\JWTSubject; 6 use Illuminate\Notifications\Notifiable; 7 use Illuminate\Foundation\Auth\User as Authenticatable; 8 9 class User extends Authenticatable implements JWTSubject 10 { 11 use Notifiable; 12 13 protected $connection = 'business'; 14 protected $table = 'jupin_erp_business.t_user'; 15 16 /** 17 * Get the identifier that will be stored in the subject claim of the JWT. 18 * 19 * @return mixed 20 */ 21 public function getJWTIdentifier() 22 { 23 return $this->getKey(); 24 } 25 26 /** 27 * Return a key value array, containing any custom claims to be added to the JWT. 28 * 29 * @return array 30 */ 31 public function getJWTCustomClaims() 32 { 33 return []; 34 } 35 36 }
5、修改 auth.php
config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt', // 原来是 token 改成jwt
'provider' => 'users',
],
],
6、注册一些路由
修改 route/api.php
Route::group(['middleware' => 'api','prefix' => 'auth'], function ($router) {
Route::post('login', 'Auth\AuthController@login');
Route::post('logout', 'Auth\AuthController@logout');
Route::post('refresh', 'Auth\AuthController@refresh');
Route::get('me', 'Auth\AuthController@me');
});
7、添加控制器
php artisan make:controller Auth/AuthController
8、添加控制器内容
文档内容
1 <?php 2 3 namespace App\Http\Controllers; 4 5 use Illuminate\Support\Facades\Auth; 6 use App\Http\Controllers\Controller; 7 8 class AuthController extends Controller 9 { 10 /** 11 * Create a new AuthController instance. 12 * 要求附带email和password(数据来源users表) 13 * 14 * @return void 15 */ 16 public function __construct() 17 { 18 // 这里额外注意了:官方文档样例中只除外了『login』 19 // 这样的结果是,token 只能在有效期以内进行刷新,过期无法刷新 20 // 如果把 refresh 也放进去,token 即使过期但仍在刷新期以内也可刷新 21 // 不过刷新一次作废 22 $this->middleware('auth:api', ['except' => ['login']]); 23 // 另外关于上面的中间件,官方文档写的是『auth:api』 24 // 但是我推荐用 『jwt.auth』,效果是一样的,但是有更加丰富的报错信息返回 25 } 26 27 /** 28 * Get a JWT via given credentials. 29 * 30 * @return \Illuminate\Http\JsonResponse 31 */ 32 public function login() 33 { 34 $credentials = request(['email', 'password']); 35 36 if (! $token = auth('api')->attempt($credentials)) { 37 return response()->json(['error' => 'Unauthorized'], 401); 38 } 39 40 return $this->respondWithToken($token); 41 } 42 43 /** 44 * Get the authenticated User. 45 * 46 * @return \Illuminate\Http\JsonResponse 47 */ 48 public function me() 49 { 50 return response()->json(auth('api')->user()); 51 } 52 53 /** 54 * Log the user out (Invalidate the token). 55 * 56 * @return \Illuminate\Http\JsonResponse 57 */ 58 public function logout() 59 { 60 auth('api')->logout(); 61 62 return response()->json(['message' => 'Successfully logged out']); 63 } 64 65 /** 66 * Refresh a token. 67 * 刷新token,如果开启黑名单,以前的token便会失效。 68 * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。 69 * @return \Illuminate\Http\JsonResponse 70 */ 71 public function refresh() 72 { 73 return $this->respondWithToken(auth('api')->refresh()); 74 } 75 76 /** 77 * Get the token array structure. 78 * 79 * @param string $token 80 * 81 * @return \Illuminate\Http\JsonResponse 82 */ 83 protected function respondWithToken($token) 84 { 85 return response()->json([ 86 'access_token' => $token, 87 'token_type' => 'bearer', 88 'expires_in' => auth('api')->factory()->getTTL() * 60 89 ]); 90 } 91 }