当前位置:首页 > 使用 JWT 保护好你的 Lumen

使用 JWT 保护好你的 Lumen

发布于 2018-06-06 阅读 1330 次 框架 Lumen PHP

依赖

  1. lumen5.6
  2. php: 7.0

jwt-auth 安装

  1. composer require tymon/jwt-auth:"^1.0@dev"
  2. #指定安装1.0的版本,0.5版本 lumen下有问题

注册服务

启动文件 bootstrap/app.php 中添加

  1. // 取消 AuthServiceProvider注释,开启 Auth 认证服务
  2. $app->register(App\Providers\AuthServiceProvider::class);
  3. // 注册 JWTAuth 服务
  4. $app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);

注册 auth 认证中间件 bootstrap/app.php

  1. $app->routeMiddleware([
  2. 'auth' => App\Http\Middleware\Authenticate::class,
  3. ]);

生成密钥

  1. php artisan jwt:secret
  2. #会在 .env 中生成 JWT_SECRET

配置 user 认证模型

app/Models/User.php

  1. namespace App\Models;
  2. use Illuminate\Auth\Authenticatable;
  3. use Laravel\Lumen\Auth\Authorizable;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Tymon\JWTAuth\Contracts\JWTSubject;
  6. use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
  7. use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
  8. class User extends Model implements AuthenticatableContract, AuthorizableContract,JWTSubject
  9. {
  10. use Authenticatable, Authorizable;
  11. protected $table = 'users';
  12. /**
  13. * The attributes that are mass assignable.
  14. *
  15. * @var array
  16. */
  17. protected $fillable = [
  18. 'name', 'email',
  19. ];
  20. /**
  21. * The attributes excluded from the model's JSON form.
  22. *
  23. * @var array
  24. */
  25. protected $hidden = [
  26. 'password',
  27. ];
  28. // Rest omitted for brevity
  29. /**
  30. * Get the identifier that will be stored in the subject claim of the JWT.
  31. *
  32. * @return mixed
  33. */
  34. public function getJWTIdentifier()
  35. {
  36. return $this->getKey();
  37. }
  38. /**
  39. * Return a key value array, containing any custom claims to be added to the JWT.
  40. *
  41. * @return array
  42. */
  43. public function getJWTCustomClaims()
  44. {
  45. return [];
  46. }
  47. }

配置 auth 认证

添加默认api认证 config/auth.php 关于 config 配置文件使用可以查看 Lumen的配置文件使用

  1. 'defaults' => [
  2. 'guard' => 'api',
  3. 'passwords' => 'users',
  4. ],

配置 api 认证驱动和服务

  1. 'guards' => [
  2. 'api' => [
  3. 'driver' => 'jwt', // jwt 认证
  4. 'provider' => 'user',
  5. ],
  6. ],

配置 api.user 服务

  1. 'providers' => [
  2. 'user' => [
  3. 'driver' => 'eloquent', // 驱动类型
  4. 'model' => App\Models\User::class, // user 模型
  5. ],
  6. ],

登陆授权,发放令牌

用户登陆后,生成令牌返回给客户端
登陆控制器中:Http/Auth/AuthController.php

  1. /**
  2. * 用户登陆
  3. *
  4. * @param Request $request
  5. * @return \Illuminate\Http\JsonResponse json
  6. */
  7. public function login(Request $request)
  8. {
  9. $credentials = $credentials = $request->only('email', 'password');
  10. $token = app('auth')->attempt($credentials);
  11. if (! $token ) {
  12. return response()->json(['error' => 'Unauthorized'], 401);
  13. }
  14. return response()->json(compact('token'));
  15. }
  16. //token 返回:
  17. //"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sdS5sb2NhbC5jb21cL3NpZ25pbiIsImlhdCI6MTUyODI4MTQ1MCwiZXhwIjoxNTI4MjgxNTEwLCJuYmYiOjE1MjgyODE0NTAsImp0aSI6ImRuV010S2x0a201dktyNm4iLCJzdWIiOjgsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.yzdN5Q9y8RaJpVW8-uqPdYAAJ6bHhmE28JBa9_IH7I0"

权限校验

给需要登陆权限的模块添加 api.auth 认证中间件

  1. $router->group(['middleware' => 'api.auth'], function () use ($router) {
  2. $router->post('/admin', 'Admin\IndexController@index');
  3. ...
  4. //需要登陆认证的controller
  5. });

构造请求

客户端在登陆获取返回的 token 后,每次携带上 token 就可以访问相关受保护的接口了

方法一:在header头中添加 Authorization 认证

  1. Authorization: Bearer token
  2. //for example:
  3. Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sdS5sb2NhbC5jb21cL3NpZ25pbiIsImlhdCI6MTUyODI4MTQ1MCwiZXhwIjoxNTI4MjgxNTEwLCJuYmYiOjE1MjgyODE0NTAsImp0aSI6ImRuV010S2x0a201dktyNm4iLCJzdWIiOjgsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.yzdN5Q9y8RaJpVW8-uqPdYAAJ6bHhmE28JBa9_IH7I0

图示

方法二:在请求参数中携带 token

  1. //for example:
  2. token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sdS5sb2NhbC5jb21cL3NpZ25pbiIsImlhdCI6MTUyODI4MTQ1MCwiZXhwIjoxNTI4MjgxNTEwLCJuYmYiOjE1MjgyODE0NTAsImp0aSI6ImRuV010S2x0a201dktyNm4iLCJzdWIiOjgsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjcifQ.yzdN5Q9y8RaJpVW8-uqPdYAAJ6bHhmE28JBa9_IH7I0

图示

JWT常用配置

常用配置

  1. //用于加密生成 token 的 secret
  2. JWT_SECRET = secret_str
  3. //token 有效的时间长度(以分钟为单位),默认为1小时
  4. //可以将其设置为空,以产生永不过期的标记
  5. JWT_TTL = 60
  6. //token 刷新的时间(以分钟为单位)。默认的时间为 2 周
  7. JWT_REFRESH_TTL = 20160
  8. //token 签名的散列算法。
  9. JWT_ALGO = 'HS256'

jwt配置文件位置

  1. /vendor/tymon/jwt-auth/config/config.php