cari
Rumahhujung hadapan webtutorial jsApa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

Apakah itu JWT? Artikel ini akan membawa anda memahami JWT, memperkenalkan aplikasi JWT dalam nod, dan kelebihan dan kekurangan JWT saya harap ia akan membantu semua orang.

Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

Apakah itu JWT

JWT ialah singkatan daripada JSON Web Token, iaitu untuk rangkaian Penyelesaian pengesahan dalam persekitaran aplikasi Dalam mekanisme pengesahan tradisional, ia tidak lebih daripada langkah berikut:

1. 用户将账号密码发送到服务器;

2. 服务器通过验证账号密码后,会在当前session中保存一些用户相关的信息,用户角色或者过期时间等等;

3. 服务器给用户一个session_id, 写入用户的Cookie或者客户端自行保存在本地;

4. 用户每次请求服务,都需要带上这个session_id,或许会通过Cookie,或者其他的方式;

5. 服务器接收到后,回去数据库查询当前的session_id,校验该用户是否有权限;

Satu kelebihan model ini ialah pelayan boleh menamatkan kebenaran pengguna pada bila-bila masa dan can go Pangkalan data mengubah suai atau memadam maklumat sesi pengguna semasa. Tetapi terdapat juga kelemahan, iaitu jika ia adalah kluster pelayan, semua mesin perlu berkongsi maklumat sesi untuk memastikan setiap pelayan boleh mendapatkan maklumat storan sesi yang sama. Walaupun masalah ini boleh diselesaikan, jumlah kerja adalah besar.

Kelebihan penyelesaian JWT ialah maklumat ini tidak disimpan Data token disimpan pada klien Setiap kali permintaan diterima, ia hanya perlu disahkan.

Prinsip JWT

Mari kita bincangkan secara ringkas tentang prinsip JWT Sebenarnya, apabila klien menghantar permintaan untuk pengesahan, pelayan akan menjana objek JSON selepas mengesahkan pengguna. Ia mungkin termasuk maklumat seperti "Siapa anda, apa yang anda lakukan, dsb., Masa tamat tempoh".

{
    username: "贼烦字符串er",
    role: "世代码农",
    endTime: "2022年5月20日"
}

Tetapi ia tidak akan dihantar kepada anda dengan cara yang begitu cetek. Ia akan ditandatangani dan dihantar melalui algoritma tandatangan boleh balik berdasarkan algoritma tandatangan yang ditentukan dan beberapa maklumat tentang muatan yang anda serahkan akan menggunakan gambar untuk mewakili format umum:

Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

Seperti yang dapat dilihat dari gambar, maklumat yang dikembalikan secara kasar dibahagikan kepada tiga bahagian Bahagian kiri adalah hasil selepas tandatangan, iaitu hasil yang dikembalikan kepada pelanggan, dan bahagian kanan juga Dinyahkodkan Kod sumber ada di sini. Tiga bahagian dipisahkan dengan "titik" dan sepadan dengan tiga warna: merah, ungu dan cyan:

<. . ia adalah algoritma simetri hanya satu kunci dikongsi antara kedua-dua pihak medan taip dikenal pasti sebagai jenis jwt ialah data sebenar yang akan dihantar. terdapat tujuh rasmi boleh digunakan: style="list-style-type: disc;">
  • iss (pengeluar): Pengeluarexp (masa tamat tempoh): Masa tamat tempoh

  • subjek (subjek): Subjek
  • aud (khalayak): Khalayak

      nbf (Tidak Sebelum): Masa berkesan
    • iat (Dikeluarkan Pada): Masa terbitan
    • jti (ID JWT): Nombor
    • Selain medan ini, anda juga boleh membuat beberapa medan tersuai Memandangkan JWT tidak disulitkan secara lalai, cuba berhati-hati untuk tidak menggunakan beberapa data sensitif semasa menggunakannya.
    • Bahagian ketiga ialah tandatangan
    • Bahagian ini adalah kunci rahsia yang ditentukan oleh anda dan hanya wujud pada pelayan, dan kemudian menggunakan algoritma yang dinyatakan dalam pengepala untuk melaksanakan. tanda kaedah tandatangan berikut.
  • Penggunaan mudah JWT
    • Mari kita rasai penggunaan khusus: Signature

      Langkah 1: Kita perlu membina projek nodejs ; mulakan projek melalui
    • ; kemudian kita perlu memasang dependensi, masing-masing mengikut status
    ,

    dan :

    dan kemudian

    Tambah Perintah

    dalam medan npm init -y: expressjsonwebtokennodemonLangkah 2: Mulakan aplikasi nod dan cipta fail app.js dalam direktori akar; : Perkenalkan

    kebergantungan, dan buat kunci peribadi antara muka dan pelayan
    $ npm i express jsonwebtoken nodemon

    package.json scripts di sini ialah kunci peribadi tersuai kami yang hanya disimpan dalam pelayan mula menulis antara muka /login untuk log masuk, dan mencipta pangkalan data simulasi tempatan untuk pengesahan, dan mengesahkan tandatangan melalui kaedah nodemon app.js:

    "scripts": {
        "start": "nodemon app.js"
    },

    Dalam kod di atas kami mencipta pembolehubah

    digunakan untuk mensimulasikan penciptaan pangkalan data akaun dan kata laluan tempatan untuk pengesahan log masuk; kemudian antara muka
    // app.js
    
    const express = require("express");
    const app = express();
    
    app.use(express.json());
    
    app.listen(3000, () => {
      console.log(3000 + " listening..."); // 监听3000端口
    });

    diwujudkan Selepas mengesahkan bahawa akaun dan kata laluan sepadan sepenuhnya, kami mengimportnya melalui pakej jsonwebtoken Kaedah orang

    di bawah objek
    // app.js
    
    //...
    const jwt = require("jsonwebtoken");
    
    const jwtKey = "~!@#$%^&*()+,";
    // ...
    ditandatangani Kaedah ini mempunyai tiga tandatangan antara muka:

    export function sign(
        payload: string | Buffer | object,
        secretOrPrivateKey: Secret,
        options?: SignOptions,
    ): string;
    
    export function sign(
        payload: string | Buffer | object,
        secretOrPrivateKey: Secret,
        callback: SignCallback,
    ): void;
    
    export function sign(
        payload: string | Buffer | object,
        secretOrPrivateKey: Secret,
        options: SignOptions,
        callback: SignCallback,
    ): void;

    这里用到了函数重载的方式实现接口,我们这里将实现最后一个接口签名,第一个参数可以是一个自定义的对象类型,也可以是一个Buffer类型,还可以直接是一个string类型,我们的源码使用了object类型,自定义了一些字段,因为jwt在进行签名是也会对这些数据一并进行签名,但是值得注意的是,这里尽量不要使用敏感数据,因为JWT默认是不加密的,它的核心就是签名,保证数据未被篡改,而检查签名的过程就叫做验证

    当然你也可以对原始Token进行加密后传输;

    第二个参数:是我们保存在服务器用来签名的秘钥,通常在客户端-服务端模式中,JWS 使用 JWA 提供的 HS256 算法加上一个密钥即可,这种方式严格依赖密钥,但在分布式场景,可能多个服务都需要验证JWT,若要在每个服务里面都保存密钥,那么安全性将会大打折扣,要知道,密钥一旦泄露,任何人都可以随意伪造JWT。

    第三个参数:是签名的选项SignOptions,接口的签名:

    export interface SignOptions {
        algorithm?: Algorithm | undefined;
        keyid?: string | undefined;
        expiresIn?: string | number | undefined;
        /** expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js).  Eg: 60, "2 days", "10h", "7d" */
        notBefore?: string | number | undefined;
        audience?: string | string[] | undefined;
        subject?: string | undefined;
        issuer?: string | undefined;
        jwtid?: string | undefined;
        mutatePayload?: boolean | undefined;
        noTimestamp?: boolean | undefined;
        header?: JwtHeader | undefined;
        encoding?: string | undefined;
    }

    这里我们用的是expiresIn字段,指定了时效时间,使用方法参考这个文档;

    第四个参数是一个回调,回调的第二个参数就是我们通过签名生成的token,最后将这个token返回给前端,以便存储到前端本地每次请求是带上到服务端进行验证。

    接下来,我们来验证一下这个接口: 我是在vscode安装的REST Client插件,之后在根目录创建一个request.http的文件,文件内写上请求的信息:

    POST http://localhost:3000/login
    content-type: application/json
    
    {
      "username": "username",
      "password": "password"
    }

    之后在命令行执行npm run start命令启动服务,之后在requset.http文件上方点击Send Request按钮,发送请求:

    Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

    请求成功后,会看到这样的响应报文:

    Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

    token字段就是我们JWT生成的token;

    下面来验证一下这个token是否有效,我们在写一个登录过后的接口:

    app.get("/afterlogin", (req, res) => {
      const { headers } = req;
      
      const token = headers["authorization"].split(" ")[1];
      // 将token放在header的authorization字段中
      jwt.verify(token, jwtKey, (err, payload) => {
        if (err) return res.sendStatus(403);
        res.json({ message: "认证成功", payload });
      });
    });

    这段代码中,通过获取请求头中的authorization字段中的token进行获取之前通过JWT生成的token。 之后通过调用jwt.verify校验方法校验这个token是否有效,这个方法分别有三个参数:

    // 有四个接口签名,可以自行查文档
    
    export function verify(
        token: string,
        // 需要检验的token
        secretOrPublicKey: Secret | GetPublicKeyOrSecret,
        // 定义在服务器的签名秘钥
        callback?: VerifyCallback<JwtPayload | string>,
        // 获取校验信息结果的回调
    ): void;

    接下来我们把刚才响应的token复制到请求头中:

    ###
    GET http://localhost:3000/afterlogin
    authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjUyNzg5NzA3LCJleHAiOjE2NTI3ODk3Mzd9.s9fk3YLhxTUcpUgCfIK4xQN58Hk_XEP5y9GM9A8jBbY

    前面的Bearer认证, 是http协议中的标准认证方式

    同样点击Send Request当看到下面图片的响应,就意味着响应成功:

    Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

    其实以上就是JWT的一些简单的用法,接下来再说一下JWT本身存在的优缺点.

    JWT的不足

    • JWT占用的存储空间其实并不小,如果我们需要签名做过多的信息,那么token很可能会超出cookie的长度限制,例如对比一下这两张图片:

    Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?

    很明显,随着payload的信息量增大,token的长度也会增加;

    • 安全性,其实如果token的占用空间过大,Cookie最大存储空间只有4kb前端可以存储在localStorage之类的本地存储,但是会带来一个问题,如果不是放在cookie的话,安全性就会大打折扣,就会有通过js脚本获取到的风险,就意味着任何hacker都可以拿着它做任何事情;

    • 不灵活的时效性,其实JWT的某方面意义在于用户token不需要持久化存储,而是采用服务器校验的方式对token进行有效校验,刚才看到了,签名也是把到期时间一并签名的,如果改变到期时间token就会被篡改,由于没有存储和手动更改时效的方法,所以很难立刻将这个token删掉,如果用户重复登陆两次,生成两个token,那么原则上两个token都是有效的;

    总结

    以上主要讲了几点:

    • Prinsip JWT terutamanya menggunakan kunci peribadi pelayan untuk menjana tandatangan JSON token untuk perbualan

    • juga memperkenalkan data dalaman JWT Komposisi digunakan oleh Header untuk menentukan algoritma dan jenis tandatangan, muatan untuk menghantar data JSON, dan Tandatangan untuk melaksanakan algoritma tandatangan pada data dan mengusik tempat

    • memberikan pengenalan terperinci tentang cara menghantar nodej menggunakan JWT, melalui kaedah sign untuk tandatangan data, dan kaedah verify untuk pengesahan tandatangan

    • juga memperkenalkan beberapa kelemahan JWT:

      • Salah satunya ialah ruang storan bertambah dengan peningkatan jumlah data tandatangan;

      • Yang lain ialah keselamatan Jika ruang storan terlalu besar , ia tidak akan disimpan pada tahap keselamatan yang agak tinggi Dalam Cookie, skrip boleh diperolehi sesuka hati; dan kemudian terdapat ketepatan masa, yang tidak boleh mengawal secara fleksibel. ketepatan masa

        ;
      • token

      Ini ialah
    • kod sumber demo
    nodej di atas, untuk rujukan

    https://github.com/wangzi6224/jwt-usage- nodejs

    Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:

    tutorial nodejs

    !

    Atas ialah kandungan terperinci Apa itu JWT? Bagaimana untuk menggunakan JWT dalam nodejs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan
    Artikel ini dikembalikan pada:掘金社区. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
    Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

    Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

    Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Apr 11, 2025 am 08:23 AM

    Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

    Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Apr 11, 2025 am 08:22 AM

    Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

    JavaScript: meneroka serba boleh bahasa webJavaScript: meneroka serba boleh bahasa webApr 11, 2025 am 12:01 AM

    JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

    Evolusi JavaScript: Trend Semasa dan Prospek Masa DepanEvolusi JavaScript: Trend Semasa dan Prospek Masa DepanApr 10, 2025 am 09:33 AM

    Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

    Demystifying JavaScript: Apa yang berlaku dan mengapa pentingDemystifying JavaScript: Apa yang berlaku dan mengapa pentingApr 09, 2025 am 12:07 AM

    JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

    Adakah Python atau JavaScript lebih baik?Adakah Python atau JavaScript lebih baik?Apr 06, 2025 am 12:14 AM

    Python lebih sesuai untuk sains data dan pembelajaran mesin, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya, dan sesuai untuk analisis data dan pembangunan web. 2. JavaScript adalah teras pembangunan front-end. Node.js menyokong pengaturcaraan sisi pelayan dan sesuai untuk pembangunan stack penuh.

    Bagaimana saya memasang javascript?Bagaimana saya memasang javascript?Apr 05, 2025 am 12:16 AM

    JavaScript tidak memerlukan pemasangan kerana ia sudah dibina dalam pelayar moden. Anda hanya memerlukan editor teks dan penyemak imbas untuk memulakan. 1) Dalam persekitaran penyemak imbas, jalankan dengan memasukkan fail HTML melalui tag. 2) Dalam persekitaran Node.js, selepas memuat turun dan memasang node.js, jalankan fail JavaScript melalui baris arahan.

    See all articles

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Cara Membuka Segala -galanya Di Myrise
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Muat turun versi mac editor Atom

    Muat turun versi mac editor Atom

    Editor sumber terbuka yang paling popular

    SecLists

    SecLists

    SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

    SublimeText3 Linux versi baharu

    SublimeText3 Linux versi baharu

    SublimeText3 Linux versi terkini

    EditPlus versi Cina retak

    EditPlus versi Cina retak

    Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod