


Rekod penuh proses simulasi sebenar pengesahan log masuk JWT
Apr 03, 2024 pm 01:22 PMSelepas kompilasi teliti oleh editor PHP Banana, kami memperkenalkan kepada anda rekod penuh popular proses simulasi pembangunan sebenar - simulasi sebenar pengesahan log masuk JWT. JWT (JSON Web Token) ialah standard terbuka untuk pengesahan Ia menghasilkan token (Token) selepas pengguna berjaya log masuk, dan pengguna membawa token ini dalam permintaan seterusnya untuk pengesahan identiti. Artikel ini akan memberikan analisis mendalam tentang proses pelaksanaan pengesahan log masuk JWT dan menyediakan rakaman demonstrasi praktikal yang komprehensif Dalam proses tersebut, kami akan membawa anda memahami prinsip JWT dan cara menerapkannya dalam pembangunan sebenar. Sama ada anda seorang pemula atau pembangun berpengalaman, anda boleh memperoleh pengetahuan dan pengalaman praktikal yang berharga daripada artikel ini.
Proses pengesahan token
- Sebagai penyelesaian pengesahan merentas domain yang paling popular, JWT (JSON WEB Token) amat disayangi oleh pemaju Proses utama adalah seperti berikut: pelanggan dan kata laluan Permintaan untuk log masuk
- Pelayan menerima permintaan dan mengesahkan sama ada kata laluan akaun lulus
- Selepas pengesahan berjaya, pelayan akan menjana token unik dan mengembalikannya kepada pelanggan
- Pelanggan menerima token dan menyimpannya dalam kuki atau Setiap kali pelanggan menghantar permintaan kepada pelayan selepas
- dalam localStroge, token akan dibawa melalui kuki atau pengepala
- Pelayan mengesahkan kesahihan token, dan hanya mengembalikan data respons selepas lulus. ia.
- Kelebihan pengesahan token
- Http
- header Stateless: Mekanisme Token tidak perlu disimpan pada maklumat sesi pelayan, kerana Token itu sendiri mengandungi maklumat semua pengguna yang log masuk, hanya maklumat status yang perlu disimpan dalam klien. cookie atau media tempatan
- Kesesuaian yang lebih luas: Selagi pelanggan menyokong protokol http, pengesahan token boleh digunakan.
- Tidak perlu mempertimbangkan CSRF: Memandangkan ia tidak lagi bergantung pada kuki, tiada CSRF akan berlaku apabila menggunakan pengesahan token, jadi tidak perlu mempertimbangkan pertahanan CSRF
- JWT structure
- string
- , ia Ia terdiri daripada tiga bahagian: pengepala, muatan dan tandatangan. Gunakan titik di tengah untuk memisahkannya kepada tiga bahagian. Ambil perhatian bahawa tiada pemisah baris di dalam JWT.
?
header
由两部分组成: 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': '飞兔小哥' ] }
- ? 签名 / Signature
- 签名部分是对上面的 头部、载荷 两部分数据进行的数据签名
- 为了保证数据不被篡改,则需要指定一个密钥,而这个密钥一般只有你知道,并且存放在服务端
- 生成签名的代码一般如下:
// 其中secret 是密钥 String signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT 基本使用
- 客户端收到服务器返回的 JWT,可以储存在 Cookie 里面, 也可以储存在 localStorage
- 然后 客户端每次与服务器通信,都要带上这个 JWT
- 把 JWT 保存在 Cookie 里面发送请求,这样不能跨域
- 更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面
fetch('license/login', { headers: { 'Authorization': 'X-TOKEN' + token } })
实战:使用 JWT 登录认证
这里使用 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
Mac, SHA256
, RSA
<?php // 全局中间件定义文件 return [ // ...其他中间件 // JWT验证 \app\middleware\Auth::class ];
Payload/ Payload
🎜🎜Payload</code The > bahagian juga merupakan objek <code>🎜js🎜ON
, digunakan untuk menyimpan data sebenar yang perlu dihantar. JWT
menentukan tujuh medan lalai untuk dipilih. 🎜🎜Selain medan lalai, anda boleh menambah mana-mana medan yang anda mahu Secara amnya, selepas pengguna berjaya log masuk, maklumat pengguna akan disimpan di sini🎜🎜iss: issuer 🎜exp: masa tamat tempoh🎜sub: Topik. 🎜aud: Pengguna 🎜nbf: Tidak tersedia sebelum ini 🎜iat: Masa keluaran 🎜jti: ID JWT digunakan untuk mengenal pasti JWT ini 🎜🎜
<?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); } }
JWT
pengesahan log masuk untuk simulasi sebenar🎜🎜 🎜Pasang sambungan JWT 🎜🎜🎜🎜🎜🎜 kaedah penjanaan dan penyahsulitan🎜🎜🎜rrreee🎜? 🎜Selepas pengguna log masuk, jana pengenalan JWT🎜🎜🎜rrreee🎜 🎜Middleware mengesahkan sama ada pengguna telah log masuk phpmiddleware🎜🎜🎜🎜 🎜🎜🎜rrreee🎜Selepas mendaftar middleware, Tingkatkan logik pengesahan dalam middleware pengesahan kebenaran🎜<?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); } }
附:为什么使用jwt而不使用session
- session是将客户端数据储存在服务器的内存,当客服端的数据过多,服务器的内存开销大;
- session的数据储存在某台服务器,在分布式的项目中无法做到共享;
- jwt的安全性更好。
总而言之,如果使用了分布式,切只能在session和jwt里面选的时候,就一定要选jwt。
Atas ialah kandungan terperinci Rekod penuh proses simulasi sebenar pengesahan log masuk JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Artikel ini akan menerangkan secara terperinci bagaimana PHP memformat baris ke dalam CSV dan menulis penunjuk fail saya rasa ia agak praktikal, jadi saya berkongsi dengan anda sebagai rujukan saya harap anda boleh memperoleh sesuatu selepas membaca artikel ini. Format baris ke CSV dan tulis ke penuding fail Langkah 1: Buka penuding fail $file=fopen("path/to/file.csv","w"); kepada rentetan CSV. Fungsi ini menerima parameter berikut: $fail: penuding fail $medan: medan CSV sebagai tatasusunan $pembatas: pembatas medan (pilihan) $kepungan: petikan medan (

Artikel ini akan menerangkan secara terperinci tentang menukar umask semasa dalam PHP Editor berpendapat ia agak praktikal, jadi saya berkongsi dengan anda sebagai rujukan saya harap anda boleh memperoleh sesuatu selepas membaca artikel ini. Gambaran keseluruhan PHP yang menukar umask semasa umask ialah fungsi php yang digunakan untuk menetapkan kebenaran fail lalai untuk fail dan direktori yang baru dibuat. Ia menerima satu hujah, iaitu nombor perlapanan yang mewakili kebenaran untuk menyekat. Sebagai contoh, untuk menghalang kebenaran menulis pada fail yang baru dibuat, anda akan menggunakan 002. Kaedah menukar umask Terdapat dua cara untuk menukar umask semasa dalam PHP: Menggunakan fungsi umask(): Fungsi umask() menukar secara langsung umask semasa. Sintaksnya ialah: intumas

Artikel ini akan menerangkan secara terperinci tentang PHP mengira cincangan fail MD5. Editor berpendapat ia agak praktikal, jadi saya berkongsi dengan anda sebagai rujukan saya harap anda boleh memperoleh sesuatu selepas membaca artikel ini. PHP mengira cincangan MD5 bagi fail MD5 (MessageDigest5) ialah algoritma penyulitan sehala yang menukarkan mesej dengan panjang sewenang-wenangnya kepada nilai cincang 128-bit panjang tetap. Ia digunakan secara meluas untuk memastikan integriti fail, mengesahkan ketulenan data dan mencipta tandatangan digital. Mengira cincang MD5 fail dalam PHP PHP menyediakan berbilang kaedah untuk mengira cincang MD5 bagi fail: Gunakan fungsi md5_file() Fungsi md5_file() mengira secara langsung nilai cincang MD5 bagi fail dan mengembalikan 32 aksara.

Artikel ini akan menerangkan secara terperinci bagaimana PHP mengembalikan tatasusunan selepas membalikkan nilai utama Editor berpendapat ia agak praktikal, jadi saya berkongsi dengan anda sebagai rujukan saya harap anda boleh memperoleh sesuatu selepas membaca artikel ini. PHP key value flip Array key value flip ialah operasi pada tatasusunan yang menukar kunci dan nilai dalam tatasusunan untuk menjana tatasusunan baharu dengan kunci asal sebagai nilai dan nilai asal sebagai kunci. Kaedah pelaksanaan Dalam PHP, anda boleh melakukan pembalik nilai kunci tatasusunan melalui kaedah berikut: fungsi array_flip(): Fungsi array_flip() digunakan khas untuk operasi flip nilai kunci. Ia menerima tatasusunan sebagai hujah dan mengembalikan tatasusunan baharu dengan kunci dan nilai ditukar. $original_array=[

Artikel ini akan menerangkan secara terperinci bagaimana PHP menentukan sama ada kunci yang ditentukan wujud dalam tatasusunan Editor berpendapat ia sangat praktikal, jadi saya berkongsi dengan anda sebagai rujukan saya harap anda boleh memperoleh sesuatu selepas membaca artikel ini. PHP menentukan sama ada kunci yang ditentukan wujud dalam tatasusunan: Dalam PHP, terdapat banyak cara untuk menentukan sama ada kunci yang ditentukan wujud dalam tatasusunan: 1. Gunakan fungsi isset(): isset($array["key"]) Fungsi ini mengembalikan nilai Boolean, benar jika kunci yang ditentukan wujud, palsu sebaliknya. 2. Gunakan fungsi array_key_exists(): array_key_exists("key",$arr

Artikel ini akan menerangkan secara terperinci pengekodan digital mesej ralat yang dikembalikan oleh PHP dalam operasi Mysql sebelumnya. Editor berpendapat ia agak praktikal, jadi saya berkongsi dengan anda sebagai rujukan . Menggunakan PHP untuk mengembalikan maklumat ralat MySQL Pengekodan Berangka Pengenalan Semasa memproses pertanyaan mysql, anda mungkin menghadapi ralat. Untuk mengendalikan ralat ini dengan berkesan, adalah penting untuk memahami pengekodan berangka mesej ralat. Artikel ini akan membimbing anda menggunakan php untuk mendapatkan pengekodan berangka mesej ralat Mysql. Kaedah mendapatkan pengekodan berangka maklumat ralat 1. mysqli_errno() Fungsi mysqli_errno() mengembalikan nombor ralat terkini sambungan MySQL semasa. Sintaksnya adalah seperti berikut: $erro

Artikel ini akan menerangkan secara terperinci tentang mendapatkan pi dalam PHP Editor berpendapat ia sangat praktikal, jadi saya berkongsi dengan anda sebagai rujukan saya harap anda dapat memperoleh sesuatu selepas membaca artikel ini. Pengenalan kepada Mendapatkan Pi dengan PHP Pi (π) ialah nisbah lilitan kepada diameter bulatan Ia adalah nombor tidak rasional dan tidak boleh dinyatakan dengan nombor terhingga digit. Dalam php, anda boleh menggunakan fungsi terbina dalam M_PI untuk mendapatkan nilai anggaran pi. Fungsi M_PI Fungsi M_PI mengembalikan nilai anggaran pi, tepat hingga 14 tempat perpuluhan. Ia adalah pemalar PHP, jadi anda tidak perlu menggunakan sebarang parameter untuk menggunakannya. Output sintaks 3.14159265358979 Kaedah alternatif Selain fungsi M_PI, terdapat beberapa alternatif

Pembangunan bahagian hadapan dan bahagian belakang adalah dua aspek penting untuk membina aplikasi web yang lengkap Terdapat perbezaan yang jelas antara mereka, tetapi ia berkait rapat. Artikel ini akan menganalisis perbezaan dan perkaitan antara pembangunan front-end dan back-end. Mula-mula, mari kita lihat definisi dan tugas khusus pembangunan bahagian hadapan dan pembangunan bahagian belakang. Pembangunan bahagian hadapan bertanggungjawab terutamanya untuk membina antara muka pengguna dan bahagian interaksi pengguna, iaitu, perkara yang dilihat dan dikendalikan oleh pengguna dalam penyemak imbas. Pembangun bahagian hadapan biasanya menggunakan teknologi seperti HTML, CSS dan JavaScript untuk melaksanakan reka bentuk dan kefungsian halaman web
