【laravel项目】@6 JWT生成的token本地化存储

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【laravel项目】@6 JWT生成的token本地化存储

我们打开项目,点击会员后可以看到我们的地址栏后边有token的这个参数


image.png                                        


这个是因为我们在账号密码登录或者微信授权登录时将参数暂时放置到了地址栏后边

image.png

                                       


我们可以打开JWT的文档:https://learnku.com/articles/17883#de9435


                             image.png          


这里有的问题所以在第七节中处理了这个问题




<?php
namespace App\Auth;
use Tymon\JWTAuth\JWT;
use Tymon\JWTAuth\JWTGuard;
use Illuminate\Http\Request;
use Illuminate\Contracts\Session\Session;
use Illuminate\Contracts\Auth\UserProvider;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Support\Facades\Redis;
class JWTSessionGuard extends JWTGuard
{
    protected $session;
    protected $id;
    public function __construct(JWT $jwt, UserProvider $provider, Request $request , Session $session){
          $this->session = $session ;
          parent::__construct($jwt, $provider, $request);
    }
    public function login(JWTSubject $user)
    {
          $token = $this->jwt->fromUser($user);
          $this->setToken($token)->setUser($user);
          $this->updateSession($user->id);
          return $token;
    }
    protected function updateSession($id)
    {
        // $this->session->put($this->getName(), $id);
        // dump(session()->all());
        // dump($this->getName());
        // $this->session->migrate(true);
        Redis::set($this->getName(), $id);
        // $this->id = $id;
    }
    public function getName()
    {
        return 'login_jwt_'.sha1(static::class);
    }
    // 检验是否登录
    public function webCheck()
    {
        // Redis::del($this->getName());
        // dump(session()->all());
        // dump($this->getName());
        $id = Redis::get($this->getName());
        dump($id);
        // $id = $this->session->get($this->getName());
        return !is_null($this->provider->retrieveById($id));
    }
}


然后添加一个验证登录的一个中间件


image.png


修改路由

image.png

然后进行测试


image.png


点击会员,用户未登录会跳转到登录页面

image.png


控制器代码

<?php
namespace App\Http\Controllers\Api\V1;
use http\Cookie;
use JWTAuth;
use App\User;
use App\Http\Controllers\Api\Traits\TransFormer;
use Dingo\Api\Routing\Helpers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AuthorizationsController extends Controller
{
    use Helpers,TransFormer;
    /**
     * 账号登录
     */
    public function store(Request $request)
    {
        $param = $request->only(['email','password']);
        if(!($token = auth('api')->attempt($param))){
            return $this->response->array($this->transFormer(4000,'用户账号密码错误'));
        }
        // dump($token);die;
        // return [
        //     'error' => 0,
        //     'message' => '登录成功',
        //     'redirect' => route('web.member.index',['token'=>$token])
        // ];
        return $this->response->array($this->transFormer(0,'用户登录成功',route('web.member.index')))->withCookie(cookie()->forever('token', $token));
    }
    /**
     * 微信网页登录
     * 这里引用了easyWechat
     */
    public function socialStore(Request $request)
    {
        $wechatUser = session('wechat.oauth_user.default');
        $user = User::where('weixin_openid',$wechatUser->id)->first();
        if(!$user){
            $user = User::create([
                'name' => $wechatUser->name,
                'weixin_openid' => $wechatUser->id
            ]);
        }
        return redirect(route('web.member.index'))->withCookie(cookie()->forever('token', auth('api')->login($user)));
        // return redirect()->route('web.member.index');
        // return redirect(route('web.member.index'))->withCookie(cookie()->forever('token',auth('api')->login($user)));
    }
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
11 1
|
2月前
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
2月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
119 3
|
3月前
|
存储 JSON JavaScript
震撼!Cookie、Session、Token、JWT 终极对决:揭开 Web 认证的神秘面纱!
【8月更文挑战第13天】Web 开发中,Cookie、Session、Token 和 JWT 常混淆。Cookie 是服务器给客户端的小信息片,如登录状态,每次请求都会返回。Session 则是服务器存储的用户数据,通过 Session ID 追踪。Token 类似通行证,证明客户端身份且可加密。JWT 是结构化的 Token,含头部、载荷及签名,确保数据完整性和安全性。
66 4
|
3月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
64 0
|
3月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
|
3月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
|
3月前
|
JSON 算法 API
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
|
3月前
|
存储 开发框架 JSON
ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token
ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token
|
3月前
|
Java Spring
JWT token验证后,通过 ThreadLocal 进行传值
JWT token验证后,通过 ThreadLocal 进行传值
49 0

热门文章

最新文章