在当前的 Web 开发中,前端与后端分离的趋势越来越明显,Headless CMS 逐渐成为一种趋势。Headless CMS 即无头 CMS,只负责内容管理,不涉及前端展示和样式等操作。当前流行的 Headless CMS 有 Strapi、Contentful、GraphCMS 等。在 Headless CMS 中实现身份认证是一项关键的功能。JWT 是一种可用于实现认证的标准,本篇文章将介绍如何在 Headless CMS 中使用 JWT 实现身份认证。
什么是 JWT
JWT 全称为 JSON Web Token,是一种轻量级的身份认证标准,在身份认证领域得到越来越广泛的应用。JWT 的设计目标是让数据能够安全且紧凑地在各个系统中传递。JWT 由三部分构成,分别是 Header、Payload 和 Signature。Header 和 Payload 都是基于 JSON,分别用于描述 JWT 的元数据和声明等信息;而 Signature 用于验证信息的真实性。
下面是一个 JWT 的示例:
-----------------------------------------------------------------------------------------------------------------------------------------------------------
上述 JWT 有三个部分:Header、Payload 和 Signature。以“ . ”为分隔符,Header 和 Payload 分别拼接为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ,它们都是使用 Base64 算法进行编码得到的字符串。在此基础上,Signature 的值如下:SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c。Signature 是使用 JWT 自定义的加解密算法对 Payload 和 Secret(密钥)进行计算得到的,用来验证 JWT 的可信性,保证 JWT 的数据没有被篡改或擅自修改。
JWT 的优缺点
下面简要描述 JWT 的优缺点:
优点
JWT 标准化,由于 JWT 是一个标准化的认证方式,因此可以更方便地在各个应用程序之间进行传递和交互。
跨语言支持,由于 JWT 的采用的 JSON 格式,在多种语言之间可以方便地进行数据传输和解析。
降低耦合性,由于 JWT 的解决方案是使用 token 来进行身份认证,也就不会涉及到与数据库的交互和更新操作,因此可以使得应用程序的耦合性降低。
缺点
安全性,由于 JWT 是存储在客户端中的,因此需要额外的措施来保障其安全性。另外,如果请求过于频繁,也可能会导致恶意攻击。
自定义较为困难,由于 JWT 是标准化的方案,因此在某些方面可能比较僵硬,需要根据具体应用场景进行额外的设定。
现在开始介绍在 Headless CMS 中使用 JWT 实现身份认证的步骤。
第一步:在 Headless CMS 中配置 JWT
首先,需要在 Headless CMS 中进行 JWT 的配置,以 Strapi 为例,可以在设置中启用身份认证功能,并配置需要的算法、密钥、有效期等参数。
第二步:前端实现 JWT 认证
前端需要向 Headless CMS 请求获得 JWT,存储 JWT,并在请求 Headless CMS 时附加 JWT。
下面是一个 Vue.js 的示例代码:
------ ----- ---- -------- ------ --------- ---- ------------- ----- ------- - ------ ----- ------ - ----- -- -- - --- --- - ------------------------------ -- ------ - ----- --- - ----- ------------------------- - ----------- -------- -- --- --------- ------------ -- -- --- --- - --------------- -- ----- - ----------------------------- ----- - - ------ ---- -- ----- --------- - -- -- - --------------------------------- -- ----- ------------- - -- -- - ----- --- - ------------------------------ ------ --- - -------------- - ----- -- ------ ------- - ------- ---------- -------------- --
在实现中,首先尝试从本地存储中获取 JWT,如果没有 JWT,则向 Headless CMS 发送请求,获取 JWT 并存储到本地存储中。删除 JWT 时,仅需要从本地存储中删除即可。在需要向 Headless CMS 发送请求时,需要在请求的 Header 中添加 Authorization 字段,取值为 Bearer + 空格 + JWT 字符串。
下面是在 Axios 中使用 JWT 的示例:
------ ----- ---- -------- ------ --- ---- -------- ----- ---- - -------------- -------- ---------------------- -------- - --------------- ------------------- -- --- ----------------------------------- -------- -- - ----- ----- - ----- ------------- -- ------- - ---------------------------- - ------- ---------- - ------ ------- --- ------ ------- -----
在实现中,首先在全局中创建一个 Axios 实例,并配置基本 URL 和请求头等信息。使用 Axios 的拦截器,在每次请求头中添加 JWT 后再发送请求。
第三步:后端验证 JWT
最后,需要在 Headless CMS 的后端验证 JWT 的有效性。以 Strapi 为例,只需要在请求头中读取当前请求的 JWT,然后使用配置的密钥和算法计算 signature,检查 signature 是否与 JWT 中存储的一致即可。
下面是在 Strapi 中验证 JWT 的示例代码:
----- - ----- - - ------------------ ----- - ------ - - ------------------------ ----- ----------- - ----- --------- ------- -- - ------ --- ----------------- ------- -- - --------------- ------- ----- ----- -- - -- ----- - ------------ - ---- - -------------- - --- --- -- -------------- - -------- -- - ------ - ----- ------------ - -------------------- ----- ----- -- - ----- - ----- - - ---------------------------- -- ---- --- - -- ------- - ----- ---------- - ----- ------------------ ----------------------------------------------------- -------------- - ----------- - - ----- --- - ---------------- ------ --------------- - ----- ------- --- -- -- --
在实现中,首先使用 cookie 中的 token 读取 JWT 的值,然后使用服务器配置的密钥和算法计算 signature,如果 signature 与 JWT 中保存的一致,则认为认证通过,并将 JWT 中的 payload 存储至 user 中。
总结
本文介绍了在 Headless CMS 中使用 JWT 实现身份认证的方法,主要分为几个步骤:首先在 Headless CMS 中配置 JWT,然后在前端存储和发送 JWT,最后在后端验证 JWT 的有效性。
JWT 可以在多个应用系统之间共享,可用于实现跨域认证,有效地解决了认证和授权的问题。然而 JWT 的安全性需要额外的措施保障,特别是在头信息及 Cookie 等不安全传输数据时,还需要做好加密和防护等工作。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/664e3d73d3423812e4e6c1a5