手机版

安装jwt-auth以生成令牌的示例

时间:2021-08-19 来源:互联网 编辑:宝哥软件园 浏览:

1:首先通过composer安装

作曲者需要tymon/jwt-auth

2.添加服务提供商

编辑config/app.php并添加“providers”:

tymon \ JWTAuth \ Providers \ JWTAuthServiceProvider ',

3:添加立面

编辑config/app.php并添加“别名”:

JWTAuth '=' Tymon \ JWTAuth \ Facades \ JWTAuth ',

JWTFactory '=' Tymon \ JWTAuth \ Facades \ JWTFactory ',

4:发布配置文件:

PHP artisan vendor : publish-provider=' Tymon \ JWTAuth \ Providers \ JWTAuthServiceProvider '

5:生成密钥

: PHP artisan jwt: generate

安装后执行php artisan jwt:generate,它会报告一个错误:

(1).方法Tymon \ JWTAuth \ Commands \ jwtgeneratecommands : handle()不存在

解决方案,这需要修改源代码:

编辑供应商/tymon/jwt-auth/src/commands/jwtgeneratecommand . PHP并添加:

/** *与Laravel的兼容性=5.5*/公共函数句柄(){ $ this-fire();}(2)如果不添加服务提供者,直接执行此命令也可能报错!

“jwt”命名空间中没有定义命令

解决方法:

以上是添加服务提供商

配置(配置)

秘密(秘密密钥)-秘密密钥

用于签署令牌的密钥。作者将秘钥从Laravel的APP_KEY中分离出来,让开发者可以独立修改。

提供了一个artisan命令来为我们生成一个随机密钥。(php artisan jwt:generate)

Ttl(令牌生存时间)-令牌生存时间

令牌的有效时间,以分钟为单位。建议尽量设置短点,尤其是我们还使用令牌刷新机制的时候。

Refresh _ TTL(刷新生存时间)-刷新生存时间

令牌的有效时间可以在分钟内刷新。例如,如果设置为2周,则相应的令牌只能在2周内刷新,否则将引发令牌过期异常。如果超过刷新的有效时间,必须生成全新的令牌,这意味着用户需要重新登录。

注意:ttl和refresh_ttl用于保持用户的登录状态

Algo(哈希算法)-哈希算法

用来签名令牌的算法,只保留默认值

用户(用户模型路径)-用户模型路径

应该指向我们项目的用户类的命名空间路径

标识符(用户标识符)-用户标识符

从令牌的主题声明中,根据什么身份来检索用户(通常是id)

必需的索赔(必需的索赔)

这些声明必须存在于令牌的负载中,否则将引发一个令牌无效异常(它将检测这些声明是否存在于令牌的负载中)

黑名单_已启用(黑名单已启用)

如果设置为false,令牌将不会失效。虽然我们仍然可以刷新令牌,但是前面的令牌仍然有效,所以这样做非常不安全。但是对于一个非常简单的实现,可能没有额外的开销(刷新令牌等)。),所以我们可以对其进行配置。

提供者

Jwt-auth包有一些具体的实现,可以用来满足各种需求。只要我们遵循相关的接口,我们就可以覆盖这些具体的实现。

providers.user

指定根据主题声明查找用户的实现。

providers.jwt

完成令牌编码和解码的繁重工作

providers.auth

使用凭据或id验证用户

提供商.存储

用于驱动黑名单和存储令牌,直到其过期。

创建令牌(创建令牌)

jwt-auth包为我们提供了许多创建令牌的方法。有简单的方法,如果你想要更好的控制,还有更进一步的方法。

开箱即用,有许多必要的声明,尽管这些可以配置:

包含令牌的子(主题)标识符(默认为用户标识)

Iat(发布时间)-令牌发布时间(unix时间戳)

Exp(到期)-令牌到期日期(unix时间戳)

Nbf(非之前)-可以使用令牌的最早时间点(unix时间戳)

Iss(发行者)-令牌发布者(默认为请求的url)

Jti(JWT标识)-令牌的令牌唯一标识符(由sub和iat声明的md5值)

Aud(受众)-令牌的目标受众(默认情况下不需要)

也允许自定义声明。稍后会介绍。

基于用户凭据创建令牌

创建令牌的最常见方式是通过用户的登录凭据对用户进行身份验证。如果身份验证成功,将返回与用户相关的令牌。例如,假设我们有一个Laravel AuthenticateController

使用JWTAuth使用Tymon \ JWTAuth \ Exceptions \ JWTException;class AuthenticateController扩展Controller { public function authenticate(Request $ Request){//从request $credentials中抓取凭据=$request-only('email ',' password ');尝试{ //尝试验证凭据并为用户创建令牌,如果(!idspnonenote)不支持。$ token=jwtauth : entry($ credentials)){ return response()-JSON([' error '=' invalid _ credentials '],401);} } catch (JWTException $e) { //尝试对令牌返回响应进行编码时出错()-JSON([' error '=' can _ not _ create _ token '],500);} //都好所以返回token return response()-JSON(compact(' token '));}}基于用户对象创建令牌

我们可以跳过用户身份验证,只传递一个用户对象

$ user=user :3360 first();$ token=jwtauth : from user($ user);上面两个方法还有第二个参数,它可以传递一个“自定义声明”数组

解码令牌时,这些自定义声明将与其他声明一起提供。

注意:添加大量自定义声明会增加令牌的大小

根据您喜欢的任何内容创建令牌

作者为我们提供了对底层类和方法的访问,以提供高级的和可定制的功能。

该示例使用内置的“Tymon\JWTAuth\PayloadFactory”实例(或使用JWTFactory外观):

$ custom债权=['foo'='bar ',' baz '=' bob '];$ payload=jwtfactory :3360 make($ custom claims);$ token=jwtauth : encode($ payload);您还可以在“Tymon\JWTAuth\PayloadFactory”实例上链接调用声明(或使用JWTFactory外观):

$ payload=jwtfactory :3360 sub(123)-aud(' foo ')-foo([' bar '=' baz ']);$ token=jwtauth : encode($ payload);认证(认证)

一旦用户使用他们的凭据登录,下一步就是使用token启动后续请求来检索用户的详细信息,以便我们可以将其显示为已登录。

使用内置方法通过http发起身份验证请求,我们需要设置一个Authorization请求头,如下所示:

授权:持有者{yourtokenhere} Apache用户应注意:

如果授权请求头不是base64编码的用户/密码组合,Apache似乎会丢弃它。为了解决这个问题,我们可以在apache配置文件中添加一些内容:

重写结束时的重写引擎% {http :授权}(。*)重写规则。*-[e=http _ authorization 3360% 1]或者,我们可以通过在查询字符串中包含令牌来实现它:

http://api.mysite.com/me?令牌={yourtokenhere}为了从请求中获取令牌,我们可以:

//将令牌设置为返回的对象jwtauth : parsetoken();//然后,我们可以继续链式调用方法$ user=jwtauth 3360: parse token()-authenticate();要获取令牌的值,我们可以调用:

$ token=jwtauth : gettoken();如果设置了令牌,它将返回令牌;否则(为了方便起见),它将使用上述方法尝试从请求中解析token如果没有设置标记或者没有标记可以被解析,它将最终返回false。

当然,如果我们的程序中还有其他入口点,我们也可以根据需要手动设置token。例如:

jwtauth :3360 settoken(' foo . bar . baz ');从令牌中检索经过身份验证的用户

公共函数getAuthenticatedUser() { try { if(!$ user=jwtauth : parse token()-authenticate()){ return response()-JSON(' user _ not _ found ',404);} } catch(Tymon \ JWTAuth \ Exceptions \ tokenexpireexception $ e){ return response()-JSON([' token _ expired '],$ e-getStatusCode());} catch(Tymon \ JWTAuth \ Exceptions \ tokenvalidexception $ e){ return response()-JSON([' token _ invalid '],$ e-getStatusCode());} catch(Tymon \ JWTAuth \ Exceptions \ JWTException $ e){ return response()-JSON([' token _ exception '],$ e-getStatusCode());} return response()-JSON(compact(' user '));}如果不喜欢内联捕获多个异常的方法,我们可以随意使用Laravel添加全局异常处理程序。

在app/Exceptions/Handler.php中,将下面代码添加到渲染()方法:

公共函数render($request,Exception $ e){ if($ e Tymon \ JWTAuth \ Exceptions \ tokenexpireexception的实例){ return response()-JSON([' token _ expired '],$ e-getStatusCode());} else if($ e实例的Tymon \ JWTAuth \ Exceptions \ tokenvalidexception){ return response()-JSON([' token _ invalid '],$ e-getStatusCode());} return parent : render($ request,$ e);}中间件和过滤器

如果我们使用的是Laravel 5,可以使用内置的2个中间件:

GetUserFromToken

检查请求头和查询字符串(正如上面解释过的)是否存在令牌,并尝试解码令牌。如上所述,同样的事件被触发。

刷新令牌

此中间件将再次尝试从请求中解析令牌,然后将刷新令牌(从而使旧代币失效),并将其作为下一次响应的一部分返回。这实际上产生了单个使用代币流,如果代币被泄露,这种方式会减少攻击,因为它仅对单个请求有效。

为了使用这2个中间件,我们需要将它们注册到app/Http/Kernel.php里的$ routermiddleware属性:

受保护的$ RoutemIdeWare=[.jwt.auth '=' Tymon \ JWTAuth \中间件\GetUserFromToken ',' jwt.refresh '=' Tymon \ JWTAuth \中间件\RefreshToken ',];以上这篇laravel5.5安装jwt-auth生成代币令牌的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

版权声明:安装jwt-auth以生成令牌的示例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。