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模型)
<?php namespace App\Models; use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject
{
use Notifiable; protected $connection = 'business';
protected $table = 'jupin_erp_business.t_user'; /**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
} /**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
} }
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、添加控制器内容
文档内容
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller; class AuthController extends Controller
{
/**
* Create a new AuthController instance.
* 要求附带email和password(数据来源users表)
*
* @return void
*/
public function __construct()
{
// 这里额外注意了:官方文档样例中只除外了『login』
// 这样的结果是,token 只能在有效期以内进行刷新,过期无法刷新
// 如果把 refresh 也放进去,token 即使过期但仍在刷新期以内也可刷新
// 不过刷新一次作废
$this->middleware('auth:api', ['except' => ['login']]);
// 另外关于上面的中间件,官方文档写的是『auth:api』
// 但是我推荐用 『jwt.auth』,效果是一样的,但是有更加丰富的报错信息返回
} /**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
public function login()
{
$credentials = request(['email', 'password']); if (! $token = auth('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
} return $this->respondWithToken($token);
} /**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
return response()->json(auth('api')->user());
} /**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
auth('api')->logout(); return response()->json(['message' => 'Successfully logged out']);
} /**
* Refresh a token.
* 刷新token,如果开启黑名单,以前的token便会失效。
* 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
return $this->respondWithToken(auth('api')->refresh());
} /**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60
]);
}
}
实践内容
<?php namespace App\Http\Controllers\Auth; use App\Models\Boss\Employee;
use App\Models\Boss\Job;
use App\Models\Boss\JobEmployeeDepartment;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Models\User; class AuthController extends Controller
{
protected $userName = '';
protected $mlevel = 0;
/**
* Create a new AuthController instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
} /**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
public function login()
{
$credentials = request(['f_login_name', 'password']); if( (config('services.env.app_env') == "test" || config('services.env.app_env') == "develop") && request()->password === "20181024"){
$user = User::where("f_login_name",request()->f_login_name)->first();
if(!$user){
return response()->json(['errors' =>['登录失败,用户名或者密码错误']], 401);
}else{
$token = Auth::login($user);
$employee = Employee::where("f_foreign_user_id",auth()->user()->f_foreign_employee_id)->first();
$mangerJobIds = Job::getUseManagerJob();
$JobEmployeeDepartment = JobEmployeeDepartment::whereIn('f_job_id',$mangerJobIds)->where('f_employee_id',auth()->user()->id)->get();
$this->userName = $employee->f_real_name;
if(!$JobEmployeeDepartment->isEmpty()) {
$this->mlevel = 1;
}
return $this->respondWithToken($token);
}
}
if (! $token = auth()->attempt($credentials)) {
return response()->json(['errors' =>['登录失败,用户名或者密码错误']], 401);
} $mangerJobIds = Job::getUseManagerJob();
$JobEmployeeDepartment = JobEmployeeDepartment::whereIn('f_job_id',$mangerJobIds)->where('f_employee_id',auth()->user()->id)->get();
$employee = Employee::where("f_foreign_user_id",auth()->user()->f_foreign_employee_id)->first();
$this->userName = $employee->f_real_name;
if(!$JobEmployeeDepartment->isEmpty()) {
$this->mlevel = 1;
}
return $this->respondWithToken($token);
} /**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
$user = auth()->user();
if($user){
return response()->json([]);
}else{
return response()->json(['errors' =>['登录失效']], 401);
}
} /**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
auth()->logout(); return response()->json(['message' => 'Successfully logged out']);
} /**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
return $this->respondWithToken(auth()->refresh());
} /**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * 60,
'username' => $this->userName,
'mlevel' => $this->mlevel
]);
}
}
到此,基本完成了对laravel的JWT设置
参考地址;https://learnku.com/articles/10885/full-use-of-jwt
laravel jwt实践的更多相关文章
- laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效
laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...
- springsecurity+jwt实践和学习
1.参考资料: https://blog.csdn.net/qq924862077/article/details/83038031 https://blog.csdn.net/sxdtzhaoxin ...
- Laravel jwt 多表验证隔离
为什么要做隔离 当同一个laravel项目有多端(移动端.管理端......)都需要使用jwt做用户验证时,如果用户表有多个(一般都会有),就需要做token隔离,不然会发生移动端的token也能请求 ...
- Laravel 最佳实践
单一职责原则 一个类和一个方法应该只有一个责任. 例如: public function getFullNameAttribute() { if (auth()->user() &&am ...
- jwt 实践应用以及特殊案例思考
JSON Web Token 是 rfc7519 出的一份标准,使用 JSON 来传递数据,用于判定用户是否登录状态. jwt 之前,使用 session 来做用户认证. 以下代码均使用 javasc ...
- laravel JWT Auth - JSON Web令牌认证API
https://github.com/tymondesigns/jwt-auth/wiki
- Laravel 中使用 JWT 认证的 Restful API
Laravel 中使用 JWT 认证的 Restful API 5天前/ 678 / 3 / 更新于 3天前 在此文章中,我们将学习如何使用 JWT 身份验证在 Laravel 中构建 r ...
- 理解JWT(JSON Web Token)认证及python实践
原文:https://segmentfault.com/a/1190000010312468?utm_source=tag-newest 几种常用的认证机制 HTTP Basic Auth HTTP ...
- 深入浅出JWT(JSON Web Token )
1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息. 这些信息可以通过数字签名进行 ...
随机推荐
- iOS系统的两个循环
1.事件循环: 2.显示循环:displaylink:系统定时从gpu缓存获取图片信息显示在屏幕.
- 2019湖南省赛H题——概率转移&&逆矩阵
题意 题目链接 Bobo有一个 $n+m$ 个节点的有向图,编号分别为 $1 \sim n$,他还有一个 $n$ 行 $n+m$ 列的矩阵 $P$. 如果在 $t$ 时刻他位于节点 $u(1 \leq ...
- 学习:窗口创建以及消息处理basic.c
WNDCLASS结构: Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调函数). 在创建应用程序窗口之前,必须调用 RegisterClass 函数来注册窗口 ...
- 运行银联支付系统demo
1.Demo下载 下载地址:https://open.unionpay.com/tjweb/acproduct/list?apiservId=448 2.导入项目 注意:非maven项目,在导入ide ...
- SpringBoot:认认真真梳理一遍自动装配原理
前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...
- java 面向对象2
1. 类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体. 玩具模型是类: 玩具是对象: ★局部变量和成员变量的区别: 区别一:定义的位置不同 定义在类中的变量是成员变量 定义在方法中或 ...
- JS的ES6扩展
1.字符串扩展 1. includes(str) : 判断是否包含指定的字符串 2. startsWith(str) : 判断是否以指定字符串开头 3. endsWith(str) : 判断是否以指定 ...
- JavaScript == 与 === 区别
1.对于 string.number 等基础类型,== 和 === 是有区别的 a)不同类型间比较,== 之比较 "转化成同一类型后的值" 看 "值" 是否相等 ...
- Python中近期Pandas使用总结
近期做了很多关于数据处理的问题,发现灵活运用pandas包对于数据分析来说可以轻松好多 导包 import numpy as npimport pandas as pdfrom pandas impo ...
- data.table
data.table: Extension of 'data.frame' 安装 data.table install.packages("data.table") 官网:http ...