转载 http://www.heibaiketang.com/blog/show/3.html

https://packagist.org/packages/tymon/jwt-auth#1.0.0-rc.2

jwt介绍

JWT(JSON Web Token)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

jwt原理

载荷(Payload)
{
"sub": "1",
"iss": "http://localhost:8000/auth/login",
"iat": 1451888119,
"exp": 1454516119,
"nbf": 1451888119,
"jti": "37c107e4609ddbcc9c096ea5ee76c667"
}
/*
sub: 该JWT所面向的用户
iss: 该JWT的签发者
iat(issued at): 在什么时候签发的token
exp(expires): token什么时候过期
nbf(not before):token在此时间之前不能被接收处理
jti:JWT ID为web token提供唯一标识
*/

将上面对象用 “base64编码”就形成了“载荷(Payload)”

头部(Header)
{
"typ": "JWT",
"alg": "HS256"
}
//HS256算法

进行Base64编码 就成了 头部(Header)

签名(签名)

两个编码后的字符串都用句号"."连接在一起 exp

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ

在使用HS256加密,这里需要引入一个安全密钥(secret),下面这个函数,不是PHP,自己去找下hs256如何加密,参考函数

crypt()
hash('sha256','string');
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)

得到exp

wyoQ95RjAyQ2FF3aj8EvCSaUmeP0KUqcCJDENNfnaT4

最后将这一部分签名也拼接在被签名的字符串后面,我们就得到了完整的JWT

JWT exp:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ.wyoQ95RjAyQ2FF3aj8EvCSaUmeP0KUqcCJDENNfnaT4

安装jwt

composer require tymon/jwt-auth:1.0.0-rc.2 这里指定了版本,我就先用1.0.0的

官方文档地址

http://jwt-auth.readthedocs.io/en/develop/

配置信息

配置的要求基本都是app引入服务商,配置config文件 config/app.php

'providers' => [
...
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]

生成配置文件到config下

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

生成一个安全密钥 secret key

php artisan jwt:secret

实战部分

######1、创建用户表,这里使用默认的

php artisan migrate
2、创建一个jwt的用户类
php artisan make:model Model/JwtUser

类的内容可以参考官方给的app/User.php文件

<?php

namespace App\Model;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;//比User.php多了这个引入,下面并且继承这个接口 class JwtUser extends Authenticatable implements JWTSubject
{
protected $table="users";
// Rest omitted for brevity
protected $fillable = ['name', 'email'];
protected $hidden = ['password', 'remember_token'];
/**
* 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 [];
}
}
3、配置auth.php文件的guard类型

在guards下面增加一个数组

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
], 'api' => [
'driver' => 'token',
'provider' => 'users',
],
'apijwt'=>[
'driver'=>'jwt',
'provider'=>'jwt'
]
],

'providers' 下增加一个驱动

'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'jwt' => [
'driver' => 'eloquent',
'model' => App\Model\JwtUser::class,//对应第二步创建的
] // 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
4、创建一个控制器来认证一下jwt的使用
php artisan make:controller JwtController

写个注册操作,这里用了手动认证

/*注册*/
public function register(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required',
]);
$credentials = [
'email' => $request->input('email'),
'password' => bcrypt($request->input('password')),
];
$user = JwtUser::create($credentials);
if($user)
{
$token = JWTAuth::fromUser($user);
return response()->json(['result' => $token]);
} }

登录操作

/*登录*/
public function login(Request $request)
{ $credentials = $request->only('email','password'); if ( $token = Auth::guard($this->guard)->attempt($credentials) ) { return response()->json(['result' => $token]);
} else {
return response()->json(['result'=>false]);
}
}

整个控制器如下

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\JwtUser;
use App\Http\Requests;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Support\Facades\Validator;
use Tymon\JWTAuth\Facades\JWTAuth;
use Illuminate\Support\Facades\Auth; class JwtController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
//
protected $guard = 'apijwt'; /*注册*/
public function register(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required',
]);
$credentials = [
'email' => $request->input('email'),
'password' => bcrypt($request->input('password')),
];
$user = JwtUser::create($credentials);
if($user)
{
$token = JWTAuth::fromUser($user);
return response()->json(['result' => $token]);
} }
public function index(){
echo 'Your has login ';
$token = JWTAuth::getToken();
$user = JWTAuth::parseToken()->authenticate();
echo "\n".var_dump($user);
} /*登录*/
public function login(Request $request)
{ $credentials = $request->only('email','password'); if ( $token = Auth::guard($this->guard)->attempt($credentials) ) { return response()->json(['result' => $token]);
} else {
return response()->json(['result'=>false]);
}
}
}

######5、配置路由

Route::group(['prefix' => 'jwt'], function () {
Route::post('register', 'JwtController@register');
Route::post('login', 'JwtController@login');
Route::get('/', ['uses'=>'JwtController@index','middleware'=>'auth:apijwt']);
});
6、取消csrf_token限制

app/http/Middleware

protected $except = [
'/jwt/*'
];
7、测试

 将这个返回的值复制下来

 Route::get('/', ['uses'=>'JwtController@index','middleware'=>'auth:apijwt']);

这个定义了,认证之后才能访问

打开 

如果不带token试试 

使用header的Authorization header

Authorization: Bearer eyJhbGciOiJIUzI1NiI...
//这里前面加Bearer

jwt参考函数

attempt() //$token = auth()->attempt($credentials);
login()
//user = User::first();
// Get the token
//$token = auth()->login($user);
user() //取得当前认证的用户
userOrFail()
logout()
refresh()
invalidate() :令牌无效
tokenById() :取得token来至user的id
payload()
validate()

laravel 之jwt认证使用详解的更多相关文章

  1. laravel 中JWT完整使用详解

    https://laravel-china.org/articles/10885/full-use-of-jwt

  2. IdentityServer4实战 - JWT Token Issuer 详解

    原文:IdentityServer4实战 - JWT Token Issuer 详解 一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版 ...

  3. JWT基础概念详解

    JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ...

  4. Microsoft Office Specialist (MOS) 认证考试详解---word 2010 部分

    Microsoft Office Specialist ( MOS)认证考试详解 首先是   Microsoft Certification overview http://www.microsoft ...

  5. WS Security 认证方式详解

    本文参考文档如下: MSDN 官方详解 : http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/HowASP.NET ...

  6. Laravel 5.3 请求处理管道详解

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...

  7. Kerberos认证流程详解

    Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中.了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题.为此,本 ...

  8. HTTP认证方式详解

    HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate   HTTP认证 基于 质询 /回应( challenge/response)的认证模式.   ◆ ...

  9. oracle数据库启动流程及登录认证方式详解

    转自:https://www.2cto.com/database/201803/726644.html ■  oracle启动流程-windows下 1) lsnrctl start  (启动监听) ...

随机推荐

  1. linux:基本指令mkdir, rmdir 和rm

    mkdir 建立文件夹 mkdir (make directory) 就是创建一个文件夹的意思, 使用起来很简单. 1.新建一个目录: $ mkdir folder2 如果你想在这个目录给 folde ...

  2. bc https://en.wikipedia.org/wiki/Gossip_protocol

    分布式容错性:分布式网络极其鲁棒,能够容忍部分节点的异常状态: 不可篡改性:一致提交后的数据会一直存在,不可被销毁或修改: 隐私保护性:密码学保证了数据隐私,即便数据泄露,也无法解析. 随之带来的业务 ...

  3. [DPI][suricata] suricata-4.0.3 安装部署

    suricata 很值得借鉴.但是首先还是要安装使用,作为第一步的熟悉. 安装文档:https://redmine.openinfosecfoundation.org/projects/suricat ...

  4. appium入门(1)__ appium介绍

    摘自:http://www.testclass.net/appium/appium-base-summary/ 1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android ...

  5. webpack打包配置模板

    /** * Created by zzq on 2017/3/26. *///__dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录module.exports = {//注 ...

  6. zabbix 3.2源码安装

    环境: centos7.2 nginx 1.10.3 mysql 5.5.38 php 5.5.38 一.zabbix介绍 1.Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企 ...

  7. 这套方法论,彻底终结MySQL同步延迟问题

    作者介绍 张秀云,网名飞鸿无痕,现任职于腾讯,负责腾讯金融数据库的运维和优化工作.2007年开始从事运维方面的工作,经历过网络管理员.Linux运维工程师.DBA.分布式存储运维等多个IT职位.对Li ...

  8. CA证书和TLS介绍

    数字签名 用自己的私钥给数据加密就叫数字签名 公钥传输威胁 在A和B的通信中,C可以把自己的公钥发给A,让A把C的公钥当成B的公钥,这样的话.B拿到加密数据反而无法解密,而C却可以解密出数据.从而实现 ...

  9. PowerTCP FTP for .NET 在线e文文档

    http://www.dart.com/help/ptftpnet/webframe.html

  10. Redis入门到高可用(八)——list

    一.结构 key - value 结构,value是一个有序队列. 可进行左边的添加及弹出,右边的添加及弹出. 可获取列表的长度,删除列表中指定元素,获取列表的子列表,按照索引获取列表的指定元素. 特 ...