官网:https://jwt-auth.readthedocs.io

参考:https://learnku.com/articles/10885/full-use-of-jwt#99529f

1、token是什么

​ token 翻译为令牌,就是鉴别身份的凭据,类似于身份证;

​ token 本质就是一大串字符串,最常用的场景就是接口对接的鉴权。

​ token 通过一次登录验证,得到一个鉴权字符串,随后其它的请求每次都携带这个鉴权字符串,即可完成鉴权。

2、jwt是什么

​ jwt 全称json web token(翻译为数据网络令牌)

​ jwt 是一种规范化的 token,让数据在网络中安全传输。

​ jwt 使用场景:

​ 无状态的 RESTful API

​ SSO 单点登录

3、jwt安装&配置

3.1、通过composer安装

//安装1.0以上版本

composer require tymon/jwt-auth 1.*@rc

3.2、配置

添加配置(config/app.php)

//providers元素中添加:
Tymon\JWTAuth\Providers\LaravelServiceProvider::class, //aliases元素中添加:
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,

发布配置

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
//会自动生成一个配置文件:config/jwt.php

3.3、生成加密密钥

php artisan jwt:secret
//.env 文件下生成一个加密密钥

3.4、更新生成token模型

如果使用默认的 User 表来生成 token,app\user.php

实现JWTSubject接口,实现getJWTIdentifier()和getJWTCustomClaims()方法

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
...
public function getJWTIdentifier()
{
return $this->getKey();
} public function getJWTCustomClaims()
{
return [];
}
}

3.5.修改 auth.php

​ config/auth.php

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt', // 原来是 token 改成jwt
'provider' => 'users',
],
],

4、jwt准备

4.1、新建控制器

php artisan make:controller AuthController

4.2、控制器添加方法

官方案例:

​ login登录,me获取用户信息,logout退出登录,refresh刷新token,respondWithToken返回token

<?php
namespace App\Http\Controllers; 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
]);
}
}

4.3、添加路由

routes/api.php

Route::group(['prefix' => 'auth'], function(){
Route::post('login', 'AuthController@login');
Route::post('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh');
Route::post('me', 'AuthController@me');
});

4.4、添加users表数据

可以注册是如何添加的,看一下密码的加密方式

App\Http\Controllers\Auth\RegisterController

...
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}

添加一条用户数据

routes/web.php

Route::get('/register', function(){
\App\User::create([
'name' => 'bb',
'email' => 'test@bb.com',
'password' => \Illuminate\Support\Facades\Hash::make('123456'),
]);
});

5、jwt使用

jwt koken两种使用方式

加到 url 中:?token=你的token

加到 header 中,建议用这种,因为在 https 情况下更安全:Authorization:Bearer 你的token

第二种方式的 Bearer Bearer Bearer 别漏了,

也可以在 AuthController respondWithToken() 返回的时候加上 'Bearer '.$token

6、结果

1、登录返回token

经测试,登录多次产生的token都可以在有效期内使用

其他接口请求时,携带登录返回的token

2、获取用户信息

3、退出,删除token

4、刷新token

最新文章

  1. RabbitMQ框架学写笔记-20161130
  2. Get item by sharepoint web service jquery
  3. zlog学习笔记(zc_arraylist)
  4. Android Audio控制和MediaButton远程控制(音视频控制配合)
  5. 368. Largest Divisible Subset -- 找出一个数组使得数组内的数能够两两整除
  6. c/c++中主线程退出,子线程也会退出
  7. Poj 1222 EXTENDED LIGHTS OUT
  8. 关于SWT/JFace中其他常用的事件
  9. JBPM4中常用概念总结
  10. phpmyadmin登陆提示#2002 无法登录 MySQL 服务器和设置自增
  11. 第三方账号登录--QQ登录,以及QQ微博账号登录
  12. 串口调试工具(Python2.7+pyserial+Tkinter)
  13. 多玩YY聊天记录解析全过程
  14. JVM学习03:性能监控工具
  15. 八、pyqt5按钮类控件——QPushButton、QRadioButton、QCheckBox
  16. 关于PHP程序员技术职业生涯规划
  17. ActiveMQ producer不断发送消息,会导致broker内存耗尽吗?
  18. 【JUC源码解析】DelayQueue
  19. linux内核设计与实现一书阅读整理 之第十八章
  20. 采用dlopen、dlsym、dlclose加载动态链接库【总结】【转】

热门文章

  1. sqlserver游标使用误区
  2. gfnormal 域名 是阿里云的高防IP
  3. codeforces 686A A. Free Ice Cream(水题)
  4. 输出两个MAC地址之间的地址
  5. 【转】zip() 函数
  6. Ajax跨域访问等问题
  7. 10款Web开发最佳的Python框架
  8. HDU 2340 Obfuscation (暴力)
  9. Linux 系统管理命令 - vmstat - 虚拟内存统计
  10. Ruby&#160;&#160;Numeric类