当前位置:   article > 正文

Laravel 使用 JWT 完成多用户认证_多类型用户进行jwt鉴权

多类型用户进行jwt鉴权

JWT ------ json web Token

作用:

1.降低耦合性,适用于前后端分离,分布式架构,取代传统的session

2.较少服务器和数据库的压力

JWT的结构

JWT包含了使用.分隔的三部分: Header 头部 Payload 负载 Signature 签名 结构为 Header.Payload.Signature

Header

在header中通常包含了两部分:token类型和采用的加密算法。{ "alg": "HS256", "typ": "JWT"} 接下来对这部分内容使用 Base64Url 编码组成了JWT结构的第一部分。

Payload

Token的第二部分是负载,它包含了claim, Claim是一些实体(通常指的用户)的状态和额外的元数据,有三种类型的claim:reserved,public 和 private.Reserved claims: 这些claim是JWT预先定义的,在JWT中并不会强制使用它们,而是推荐使用,常用的有 iss(签发者),exp(过期时间戳), sub(面向的用户), aud(接收方), iat(签发时间)。 Public claims:根据需要定义自己的字段,注意应该避免冲突 Private claims:这些是自定义的字段,可以用来在双方之间交换信息 负载使用的例子:{ "sub": "1234567890", "name": "John Doe", "admin": true} 上述的负载需要经过Base64Url编码后作为JWT结构的第二部分。

Signature

创建签名需要使用编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。例如如果希望使用HMAC SHA256算法,那么签名应该使用下列方式创建: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 签名用于验证消息的发送者以及消息是没有经过篡改的。 完整的JWT 完整的JWT格式的输出是以. 分隔的三段Base64编码,与SAML等基于XML的标准相比,JWT在HTTP和HTML环境中更容易传递。 下列的JWT展示了一个完整的JWT格式,它拼接了之前的Header, Payload以及秘钥签名

例如:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjUsImlzcyI6Imh0dHA6Ly93d3cubGFyYXZlbGp3dC5jb20vYXBpL2xvZ2luIiwiaWF0IjoxNTM1NTMwMTY1LCJleHAiOjE1MzU1MzM3NjUsIm5iZiI6MTUzNTUzMDE2NSwianRpIjoieHk1bXlTRTN3RE16Sm1DaCJ9.6DVuASwFvnN-y2mkCeF89_75jcFXSpffkEvI_e8sAa8

 

开始使用

安装扩展

composer require tymon/jwt-auth

编辑 config/app.php

providers 中添加
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,

aliases 添加

  1. 'JWTAuth'=> Tymon\JWTAuth\Facades\JWTAuth::class,
  2. 'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class

发布JWT的配置文件

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

生成JWT Key

php artisan jwt:generate

创建中间件解决跨域问题(无需跨域可以省去此步奏)

php artisan make:middleware CORS

编辑 app/Http/Middleware/CORS.php

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class CORS
  5. {
  6. /**
  7. * Handle an incoming request.
  8. *
  9. * @param \Illuminate\Http\Request $request
  10. * @param \Closure $next
  11. * @return mixed
  12. */
  13. public function handle($request, Closure $next)
  14. {
  15. //解决跨域问题
  16. header('Access-Control-Allow-Origin: *');
  17. $headers = [
  18. 'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
  19. 'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
  20. ];
  21. if($request->getMethod() == "OPTIONS") {
  22. return Response::make('OK', 200, $headers);
  23. }
  24. $response = $next($request);
  25. foreach($headers as $key => $value)
  26. $response->header($key, $value);
  27. return $response;
  28. }
  29. }

注册中间件  ----编辑app/Http/Kernel.php

 

 

创建中间件验证token

php artisan make:middleware User\authJWT

编辑 app/Http/Middleware/authJWT.php

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Tymon\JWTAuth\Facades\JWTAuth;
  5. use Tymon\JWTAuth\Exceptions\JWTException;
  6. use Tymon\JWTAuth\Exceptions\TokenExpiredException;
  7. use Tymon\JWTAuth\Exceptions\TokenInvalidException;
  8. class authJWT
  9. {
  10. /**
  11. * Handle an incoming request.
  12. *
  13. * @param \Illuminate\Http\Request $request
  14. * @param \Closure $next
  15. * @return mixed
  16. */
  17. public function handle($request, Closure $next)
  18. {
  19. \Config::set('jwt.user' , "App\Models\Admin");
  20. \Config::set('auth.providers.users.model', \App\Models\Admin::class);
  21. try {
  22. if (!$user = JWTAuth::toUser(JWTAuth::getToken())){
  23. return response()->json([
  24. 'errcode' => 400004,
  25. 'errmsg' => '无此用户'
  26. ], 404);
  27. }
  28. } catch (TokenExpiredException $e) {
  29. return response()->json([
  30. 'errcode' => 400001,
  31. 'errmsg' => 'token 过期'
  32. ], $e->getStatusCode());
  33. } catch (TokenInvalidException $e) {
  34. return response()->json([
  35. 'errcode' => 400003,
  36. 'errmsg' => 'token 失效'
  37. ], $e->getStatusCode());
  38. } catch (JWTException $e) {
  39. return response()->json([
  40. 'errcode' => 400002,
  41. 'errmsg' => 'token 参数错误'
  42. ], $e->getStatusCode());
  43. }
  44. return $next($request);
  45. }
  46. }

注册该中间件----编辑app/Http/Kernel.php

创建控制器处理所有的请求

php artisan make:controller  User\ApiController
  1. <?php
  2. namespace App\Http\Controllers\User;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\Admin;
  6. use Tymon\JWTAuth\Facades\JWTAuth;
  7. class ApiController extends Controller
  8. {
  9. /*注册*/
  10. public function register(Request $request)
  11. {
  12. $input = $request->all();
  13. $input['password'] = md5($input['password']);
  14. Admin::create($input);
  15. return response()->json(['result'=>true]);
  16. }
  17. /*登陆*/
  18. public function login(Request $request)
  19. {
  20. \Config::set('jwt.user' , "App\Models\Admin");
  21. \Config::set('auth.providers.users.model', \App\Models\Admin::class);
  22. $input = $request->all();
  23. $input['password'] = md5($input['password']);
  24. if($user=Admin::where($input)->first()){
  25. $token=JWTAuth::fromUser($user);
  26. }else{
  27. return response()->json(['result' => '账号或密码错误.']);
  28. }
  29. return response()->json(['result' => $token]);
  30. }
  31. /*获取用户信息*/
  32. public function get_user_details(Request $request)
  33. {
  34. $user = JWTAuth::toUser(JWTAuth::getToken());
  35. return response()->json(['result' => $user]);
  36. }
  37. public function quitLogin()
  38. {
  39. JWTAuth::invalidate(JWTAuth::getToken());
  40. return response()->json(['msg' =>'退出成功']);
  41. }
  42. }

创建自己的用户模型 (使用框架的权限和用户表可以省去此步奏)

php artisan make:model  Models/Admin

编辑路由文件 routes\api.php

  1. <?php
  2. use Illuminate\Http\Request;
  3. /*
  4. |--------------------------------------------------------------------------
  5. | API Routes
  6. |--------------------------------------------------------------------------
  7. |
  8. | Here is where you can register API routes for your application. These
  9. | routes are loaded by the RouteServiceProvider within a group which
  10. | is assigned the "api" middleware group. Enjoy building your API!
  11. |
  12. */
  13. Route::group(['middleware' => ['api','cors']], function () {
  14. Route::post('register', 'User\ApiController@register'); // 注册
  15. Route::post('login', 'User\ApiController@login'); // 登陆
  16. Route::group(['middleware' => 'jwt.auth'], function () {
  17. Route::get('get_user_details', 'User\APIController@get_user_details'); // 获取用户详情
  18. Route::get('quitLogin', 'User\APIController@quitLogin'); // 退出登录
  19. });
  20. });

测试 使用(postman)

1.注册

2.登录 获取token

3.请求用户信息

如果token 错误

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/364029
推荐阅读
相关标签
  

闽ICP备14008679号