PHP 편집자 Banana가 세심하게 편집한 후 인기 있는 실제 개발 시뮬레이션 프로세스 전체 기록인 JWT 로그인 인증 실제 시뮬레이션을 소개합니다. JWT(JSON 웹 토큰)는 인증을 위한 개방형 표준으로, 사용자가 성공적으로 로그인한 후 토큰(토큰)을 생성하고 사용자는 이후 신원 인증 요청 시 이 토큰을 전달합니다. 이 글에서는 JWT 로그인 인증 구현 과정을 심층적으로 분석하고, 그 과정에서 JWT의 원리와 실제 개발에 적용하는 방법에 대해 포괄적이고 실용적인 데모 녹음을 제공할 것입니다. 초보자이든 숙련된 개발자이든 이 기사를 통해 귀중한 지식과 실제 경험을 얻을 수 있습니다.
Header/header
header
는 token
유형 JWT
및 algorithmheader
由两部分组成: token
的类型 JWT
和算法名称:H<strong class="keylink">Mac</strong>
、SHA256
、RSA
{ "alg": "HS256", "typ": "JWT" }
? 载荷 / Payload
Payload
部分也是一个 <strong class="keylink">js</strong>ON
对象,用来存放实际需要传递的数据。JWT
指定七个默认字段供选择。
除了默认字段之外,你完全可以添加自己想要的任何字段,一般用户登录成功后,就将用户信息存放在这里
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
{ "iss": "xxxxxxx", "sub": "xxxxxxx", "aud": "xxxxxxx", "user": [ 'username': '极客飞兔', 'gender': 1, 'nickname': '飞兔小哥' ] }
// 其中secret 是密钥 String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
fetch('license/login', { headers: { 'Authorization': 'X-TOKEN' + token } })
这里使用 Think<strong class="keylink">PHP</strong>6
整合 JWT
登录认证进行实战模拟
? 安装 JWT 扩展
composer require firebase/php-jwt
? 封装生成 JWT 和解密方法
<?php namespace app\services; use app\Helper; use Firebase\JWT\JWT; use Firebase\JWT\Key; class JwtService { protected $salt; public function __construct() { //从配置信息这种或取唯一字符串,你可以随便写比如md5('token') $this->salt = config('jwt.salt') || "autofelix"; } // jwt生成 public function generateToken($user) { $data = array( "iss" => 'autofelix',//签发者 可以为空 "aud" => 'autofelix', //面象的用户,可以为空 "iat" => Helper::getTimestamp(), //签发时间 "nbf" => Helper::getTimestamp(), //立马生效 "exp" => Helper::getTimestamp() + 7200, //token 过期时间 两小时 "user" => [ // 记录用户信息 'id' => $user->id, 'username' => $user->username, 'truename' => $user->truename, 'phone' => $user->phone, 'email' => $user->email, 'role_id' => $user->role_id ] ); $jwt = JWT::encode($data, md5($this->salt), 'HS256'); return $jwt; } // jwt解密 public function chekToken($token) { JWT::$leeway = 60; //当前时间减去60,把时间留点余地 $decoded = JWT::decode($token, new Key(md5($this->salt), 'HS256')); return $decoded; } }
? 用户登录后,生成 JWT 标识
<?php declare (strict_types=1); namespace app\controller; use think\Request; use app\ResponseCode; use app\Helper; use app\model\User as UserModel; use app\services\JwtService; class License { public function login(Request $request) { $data = $request->only(['username', 'passWord', 'code']); // ....进行验证的相关逻辑... $user = UserModel::where('username', $data['username'])->find(); // 验证通过生成 JWT, 返回给前端保存 $token = (new JwtService())->generateToken($user); return json([ 'code' => ResponseCode::SUCCESS, 'message' => '登录成功', 'data' => [ 'token' => $token ] ]); } }
? 中间件验证用户是否登录
在 middleware.php
의 두 부분으로 구성됩니다. H<strong class="keylink">Mac</strong>
, SHA256
, RSA
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
?
Payload/ Payload🎜🎜🎜페이로드
부분은 전송해야 하는 실제 데이터를 저장하는 데 사용되는 🎜js🎜ON
개체이기도 합니다. JWT
는 선택할 수 있는 7개의 기본 필드를 지정합니다. 🎜🎜기본 필드 외에 원하는 필드를 추가할 수 있습니다. 일반적으로 사용자가 성공적으로 로그인하면 사용자 정보가 여기에 저장됩니다.🎜🎜iss: 발급자 🎜exp: 만료 시간🎜sub: Topic 🎜aud: 사용자 🎜nbf: 이전에는 사용할 수 없음 🎜iat: 릴리스 시간 🎜jti: 이 JWT를 식별하는 데 사용되는 JWT ID 🎜🎜
<?php declare (strict_types=1); namespace app\middleware; use app\ResponseCode; use app\services\JwtService; class Auth { private $router_white_list = ['login']; public function handle($request, \Closure $next) { if (!in_array($request->pathinfo(), $this->router_white_list)) { $token = $request->header('token'); try { // jwt 验证 $jwt = (new JwtService())->chekToken($token); } catch (\Throwable $e) { return json([ 'code' => ResponseCode::ERROR, 'msg' => 'Token验证失败' ]); } $request->user = $jwt->user; } return $next($request); } }🎜🎜? 🎜Signature/Signature🎜🎜🎜서명 부분은 데이터 바로 위에 있습니다. 헤더 및 페이로드 부분에 대한 서명 🎜🎜데이터가 변조되지 않도록 키를 지정해야 하며, 이 키는 일반적으로 본인만 알고 서버에 저장됩니다. 🎜🎜 서명은 일반적으로 다음과 같습니다. 🎜🎜🎜rrreee🎜JWT 기본 사용🎜🎜🎜클라이언트는 서버가 반환한 JWT를🎜 수신하며, 이 JWT는 쿠키나 localStorage에 저장될 수 있습니다🎜🎜클라이언트는 통신할 때마다 이를 가져와야 합니다. 서버 JWT🎜🎜JWT를 쿠키에 저장하여 요청을 보내면 도메인을 넘을 수 없습니다🎜🎜더 좋은 방법은 HTTP 요청 헤더 정보의 Authorization 필드에 이를 넣는 것입니다🎜🎜🎜rrreee🎜실전적인 전투: 사용 JWT 로그인 인증🎜🎜여기에서
Think🎜PHP🎜6
를 사용하여 실제 시뮬레이션을 위해 JWT
로그인 인증을 통합하세요🎜🎜? 🎜JWT 확장 프로그램을 설치하세요🎜🎜🎜rrreee🎜? 생성 및 복호화 방법🎜🎜🎜rrreee🎜? 🎜사용자가 로그인한 후 JWT ID를 생성합니다🎜🎜🎜rrreee🎜? 🎜미들웨어는 사용자가 로그인했는지 확인합니다🎜🎜🎜미들웨어를 middleware.php에 등록합니다.
🎜🎜🎜rrreee🎜미들웨어 등록 후, 권한 확인 미들웨어의 확인 로직 개선🎜<?php declare (strict_types=1); namespace app\middleware; use app\ResponseCode; use app\services\JwtService; class Auth { private $router_white_list = ['login']; public function handle($request, \Closure $next) { if (!in_array($request->pathinfo(), $this->router_white_list)) { $token = $request->header('token'); try { // jwt 验证 $jwt = (new JwtService())->chekToken($token); } catch (\Throwable $e) { return json([ 'code' => ResponseCode::ERROR, 'msg' => 'Token验证失败' ]); } $request->user = $jwt->user; } return $next($request); } }
总而言之,如果使用了分布式,切只能在session和jwt里面选的时候,就一定要选jwt。
위 내용은 JWT 로그인 인증의 실제 시뮬레이션 과정을 모두 기록합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!