laravel 之jwt认证使用详解
转载 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认证使用详解的更多相关文章
- laravel 中JWT完整使用详解
		https://laravel-china.org/articles/10885/full-use-of-jwt 
- IdentityServer4实战 - JWT Token Issuer 详解
		原文:IdentityServer4实战 - JWT Token Issuer 详解 一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版 ... 
- JWT基础概念详解
		JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ... 
- Microsoft Office Specialist  (MOS) 认证考试详解---word 2010 部分
		Microsoft Office Specialist ( MOS)认证考试详解 首先是 Microsoft Certification overview http://www.microsoft ... 
- WS Security 认证方式详解
		本文参考文档如下: MSDN 官方详解 : http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/HowASP.NET ... 
- Laravel 5.3 请求处理管道详解
		对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ... 
- Kerberos认证流程详解
		Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中.了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题.为此,本 ... 
- HTTP认证方式详解
		HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate HTTP认证 基于 质询 /回应( challenge/response)的认证模式. ◆ ... 
- oracle数据库启动流程及登录认证方式详解
		转自:https://www.2cto.com/database/201803/726644.html ■ oracle启动流程-windows下 1) lsnrctl start (启动监听) ... 
随机推荐
- Python:if __name__ == '__main__'
			简介: __name__是当前模块名,当模块被直接运行时模块名为_main_,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行. 关于代码if __name__ == ... 
- haproxy实现会话保持
			HAProxy系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.反向代理为什么需要设置cookie 任何一个七层的http负载均衡器,都 ... 
- ORACLE DIRECTORY目录管理步骤
			ORACLE DIRECTORY目录管理步骤 ORACLE的 DIRECTORY在数据库中是个目录的路径,需要在操作系统中有相应的目录与之对应:ORACLE目录的作用就是让ORACLE数据库和操作系统 ... 
- 洛谷P2633 Count on a tree 主席树
			传送门:主席树 解题报告: 传送门! umm这题我还麻油开始做 所以 先瞎扯一波我的想法,如果错了我就当反面教材解释这种典型错误,对了我就不管了QwQ 就直接dfs,在dfs的过程中建树 然后就直接查 ... 
- WCF访问超时:HTTP 请求已超过xx:yy分配的超时。为此操作分配的时间可能是较长超时的一部分。
			在服务端设置时间长些 <client> <endpoint address="http://43.98.49.189:5700/UPJWCFServcie.svc" ... 
- 【前端技术】web 开发常见问题--GET POST 区别
			web 开发常见问题--GET POST 区别 首先,get和post是什么? --两种 HTTP 请求方法:GET 和 POST HTTP Request Methods GET.POST 专业 ... 
- 报错解决——Failed to load resource: the server responded with a status of 404 (Not Found) favicon.ico文件找不到
			Django项目开发完成后在本地运行没问题,但在推到服务器上后出现报错Failed to load resource: the server responded with a status of 40 ... 
- 1 认识开源性能测试工具jmeter
			典型的性能测试工具主要有2个,Load Runner和jmeter.Load Runner是商业化的,Jmeter是开源的.下面我们认识一下开源性能测试工具jmeter. 1.jmeter是什么? A ... 
- java取得汉字拼音(pinyin4j)
			jar包:pinyin4j.jar 基本用法: String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重'); 例如“重”字,该方法返回一个 ... 
- 【1】vue/cli 3.0 脚手架 及cube-ui 安装
			安装 Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+).你可以使用 nvm 或 nvm-windows在同一台电脑中管理多个 Node 版本. 检查node版本: $ ... 
 
			
		

