✨ 目录
- 🎈 安装 jwt 库
- 🎈 修改文件
- 🎈 修改配置文件
- 🎈 生成Secret
- 🎈 模型修改
- 🎈 门卫验证
- 🎈 登录退出验证
- 🎈 路由守卫
- 🎈 路由配置
🎈 安装 jwt 库
composer require tymon/jwt-auth
🎈 修改文件
- 打开
bootstrap/app.php 文件,进行以下修改
$app->withFacades();
$app->withEloquent();
$app->routeMiddleware(['auth' => App\Http\Middleware\Authenticate::class,
]);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
🎈 修改配置文件
- 打开
config/auth.php 文件,进行修改 - 如果没有
config 文件夹,可以将 vendor/laravel/lumen-framework/config 文件夹复制一份,放到根目录下 - 主要修改两个地方,第一个是
guards.api.driver 中的值修改为 jwt,第二个是将 providers.users.model 修改成用来验证用户的模型
return ['defaults' => ['guard' => env('AUTH_GUARD', 'api')],'guards' => ['api' => ['driver' => 'jwt', 'provider' => 'users']],'providers' => ['users' => ['driver' => 'eloquent','model' => App\Models\User::class ]],'passwords' => [ ],
];
🎈 生成Secret
- 执行
php artisan jwt:secret 命令,将会在 .env 文件中随机生成 JWT_SECRET 参数 - 如果想配置
JWT 其他参数,可以在 .env 文件中进行如下参数编辑
// 上面命令随机生成
JWT_SECRET=5jFaYn*******************axtMwuo9k//有效时间 单位:分钟
JWT_TTL = 60//刷新时间 单位:分钟 默认 14天
JWT_REFRESH_TTL = 20160//宽限时间 单位:秒
JWT_BLACKLIST_GRACE_PERIOD = 60
🎈 模型修改
- 上面修改配置文件中,修改了
providers.users.model 值用来作为用户验证,根据自己修改的模型来进行下列修改 - 打开
App\Models\User 文件进行下列修改
namespace App\Models;use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Laravel\Lumen\Auth\Authorizable;
use Tymon\JWTAuth\Contracts\JWTSubject;class UserModel extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
{use Authenticatable, Authorizable;protected $table = 'tinygeeker_user';public $timestamps = false;protected $fillable = ['username', 'password'];protected $hidden = ['password'];public function getJWTIdentifier(){return $this->getKey();}public function getJWTCustomClaims(){return [];}
}
🎈 门卫验证
- 由于上面在
bootstrap/app.php 文件中,注册了权限验证服务 $app->register(App\Providers\AuthServiceProvider::class) - 所以打开
app/Providers/AuthServiceProvider.php,进行如下设置,使用 auth 中间件的 api 门卫的时候验证请求体
namespace App\Providers;use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;use Illuminate\Support\Facades\Auth;class AuthServiceProvider extends ServiceProvider
{public function register(){}public function boot(){$this->app['auth']->viaRequest('api', function ($request) {return app('auth')->setRequest($request)->user();});}
}
🎈 登录退出验证
- 打开 UserController 控制器,编写登录退出的逻辑
- 首先需要在构造函数
__construct 中,排除 login 验证 $this->middleware('auth:api', ['except' => ['login']]);,因为登录是不用进行用户认证的
namespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Http\Request;
use App\Models\UserModel;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;class UserController extends Controller
{public function __construct(){$this->middleware('auth:api', ['except' => ['login']]);}public function login(Request $request){$input = $request->only(['username', 'password']);$validator = Validator::make($input, ['username' => 'bail|required|min:5','password' => 'bail|required|min:6'], ['username.required' => '账号不能为空','password.required' => '密码不能为空',]);if ($validator->fails()) {return response()->json(['code' => 10000,'message' => $validator->errors()->first()]);}$user = AdminUserModel::where('username', $input['username'])->first();$token = Auth::guard('api')->login($user);return response()->json(['code' => 20000,'message' => '获取token成功','data' => ['token' => $token]]);}public function info(Request $request){$user = Auth::user();return response()->Json(['code' => 20000,'message' => '获取用户信息成功','data' => compact('user')]);}public function logout(Request $request){Auth::logout(); return response()->Json(['code' => 20000,'message' => '退出成功']);}public function refresh(){Auth::refresh();return response()->Json(['code' => 20000,'message' => '刷新成功']);}
}
🎈 路由守卫
- 如果想要在路由中使用权限认证,请在
bootstrap/app.php 中打开 $app->routeMiddleware([ 'auth' => App\Http\Middleware\Authenticate::class ]); - 因为在上面已经开启,所以只需要在
App\Http\Middleware\Authenticate.php 中进行验证即可
namespace App\Http\Middleware;use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;class Authenticate
{protected $auth;public function __construct(Auth $auth){$this->auth = $auth;}public function handle($request, Closure $next, $guard = null){if ($this->auth->guard($guard)->guest()) {return response()->Json(['code' => 10000,'message' => '无效的令牌']);}return $next($request);}
}
🎈 路由配置
- 在路由配置文件
routes/web.php 中,将需要进行验证的路由包裹起来即可
$router->group(['prefix' => 'user'], function () use ($router) {$router->post('login', '\App\Http\Controllers\UserController@login');$router->post('info', '\App\Http\Controllers\UserController@info');$router->post('logout', '\App\Http\Controllers\UserController@logout');
});
$router->group(['middleware' => 'auth:api'], function () use ($router) {$router->group(['prefix' => 'geeker'], function () use ($router) {$router->post('list', '\App\Http\Controllers\TinygeekerController@list');$router->post('add', '\App\Http\Controllers\TinygeekerController@add');});$router->group(['prefix' => 'museum'], function () use ($router) {});
});
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!