laravel jwt实践

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 }
View Code

实践内容

  1 <?php
  2 
  3 namespace App\Http\Controllers\Auth;
  4 
  5 use App\Models\Boss\Employee;
  6 use App\Models\Boss\Job;
  7 use App\Models\Boss\JobEmployeeDepartment;
  8 use Illuminate\Support\Facades\Auth;
  9 use App\Http\Controllers\Controller;
 10 use App\Models\User;
 11 
 12 class AuthController extends Controller
 13 {
 14     protected $userName = '';
 15     protected $mlevel = 0;
 16     /**
 17      * Create a new AuthController instance.
 18      *
 19      * @return void
 20      */
 21     public function __construct()
 22     {
 23         $this->middleware('auth:api', ['except' => ['login']]);
 24     }
 25 
 26     /**
 27      * Get a JWT via given credentials.
 28      *
 29      * @return \Illuminate\Http\JsonResponse
 30      */
 31     public function login()
 32     {
 33         $credentials = request(['f_login_name', 'password']);
 34 
 35         if( (config('services.env.app_env') == "test" || config('services.env.app_env') == "develop") && request()->password === "20181024"){
 36             $user = User::where("f_login_name",request()->f_login_name)->first();
 37             if(!$user){
 38                 return response()->json(['errors' =>['登录失败,用户名或者密码错误']], 401);
 39             }else{
 40                 $token = Auth::login($user);
 41                 $employee = Employee::where("f_foreign_user_id",auth()->user()->f_foreign_employee_id)->first();
 42                 $mangerJobIds = Job::getUseManagerJob();
 43                 $JobEmployeeDepartment = JobEmployeeDepartment::whereIn('f_job_id',$mangerJobIds)->where('f_employee_id',auth()->user()->id)->get();
 44                 $this->userName = $employee->f_real_name;
 45                 if(!$JobEmployeeDepartment->isEmpty()) {
 46                     $this->mlevel = 1;
 47                 }
 48                 return $this->respondWithToken($token);
 49             }
 50         }
 51         if (! $token = auth()->attempt($credentials)) {
 52             return response()->json(['errors' =>['登录失败,用户名或者密码错误']], 401);
 53         }
 54 
 55         $mangerJobIds = Job::getUseManagerJob();
 56         $JobEmployeeDepartment = JobEmployeeDepartment::whereIn('f_job_id',$mangerJobIds)->where('f_employee_id',auth()->user()->id)->get();
 57         $employee = Employee::where("f_foreign_user_id",auth()->user()->f_foreign_employee_id)->first();
 58         $this->userName = $employee->f_real_name;
 59         if(!$JobEmployeeDepartment->isEmpty()) {
 60             $this->mlevel = 1;
 61         }
 62         return $this->respondWithToken($token);
 63     }
 64 
 65     /**
 66      * Get the authenticated User.
 67      *
 68      * @return \Illuminate\Http\JsonResponse
 69      */
 70     public function me()
 71     {
 72         $user = auth()->user();
 73         if($user){
 74             return response()->json([]);
 75         }else{
 76             return response()->json(['errors' =>['登录失效']], 401);
 77         }
 78     }
 79 
 80     /**
 81      * Log the user out (Invalidate the token).
 82      *
 83      * @return \Illuminate\Http\JsonResponse
 84      */
 85     public function logout()
 86     {
 87         auth()->logout();
 88 
 89         return response()->json(['message' => 'Successfully logged out']);
 90     }
 91 
 92     /**
 93      * Refresh a token.
 94      *
 95      * @return \Illuminate\Http\JsonResponse
 96      */
 97     public function refresh()
 98     {
 99         return $this->respondWithToken(auth()->refresh());
100     }
101 
102     /**
103      * Get the token array structure.
104      *
105      * @param  string $token
106      *
107      * @return \Illuminate\Http\JsonResponse
108      */
109     protected function respondWithToken($token)
110     {
111         return response()->json([
112             'access_token' => $token,
113             'token_type' => 'bearer',
114             'expires_in' => auth()->factory()->getTTL() * 60,
115             'username' => $this->userName,
116             'mlevel' => $this->mlevel
117         ]);
118     }
119 }
View Code

 

到此,基本完成了对laravel的JWT设置

参考地址;https://learnku.com/articles/10885/full-use-of-jwt

 

posted @ 2019-07-15 11:54  php、凯  阅读(914)  评论(0编辑  收藏  举报