JWT 简介
JWT(JSON Web Token)是一种用于双方之间传递安全信息的简洁、URL 安全的方式。JWT 是基于 JSON 编码的令牌,由三部分组成:头部、载荷和签名。
头部
头部通常由两部分组成:令牌的类型(这里是 JWT)和使用的算法(比如 HMAC SHA256 或 RSA)。
{ "alg": "HS256", "typ": "JWT" }
载荷
载荷是令牌的主要内容,其中包含了需要传递的数据。载荷可以包含任何方法定义的信息,但建议只使用一些标准的声明,比如 iss(签发者)、exp(到期时间)、 sub(主题)和 aud(受众)。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
签名
签名是对前两部分的签名,以确保内容没有被篡改。签名的密钥只有服务器才知道,所以在验证签名时,只需要使用相同的密钥即可。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
实现 JWT 身份验证
在 Hapi 框架中,我们可以使用 hapi-auth-jwt2 插件来实现 JWT 身份验证。该插件将 token 验证逻辑封装在方便的方法中。
安装依赖包
在使用 hapi-auth-jwt2 插件之前,我们需要安装 jwt 和 hapi-auth-jwt2 两个依赖包:
npm install jsonwebtoken hapi-auth-jwt2 --save
注册插件
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- --- - ------------------------ ----- -------- - -------------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- -------------------------- --------------------------- ------ - ---- ------------------- -- ---- --------- --------- -------- -- -- - -- -- ----- ---- -- -------- -- ------------ - ------ - -------- ---- -- - ------ - -------- ----- -- -- -------------- - ----------- --------- - -- ---- --- -- ------ -------------- ------- ------ ----- ------- -------- --------- -- -- - ------ ------- -------- -- -------- - ----- ----- -- -- ----- -- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------------------------------- ----- -- - ----------------- ---------------- --- -------
在上面的代码中,我们首先使用 server.register
方法来注册 hapi-auth-jwt2 插件,然后使用 server.auth.strategy
方法来定义身份验证策略,并将其命名为 jwt。在验证策略中,我们需要设置密钥和算法,并实现 validate 方法来验证 token 的有效性。
最后,我们使用 server.route
方法来定义路由配置,在 options 选项中设置验证策略为 jwt,来开启 token 验证功能。
生成 token
const jwt = require('jsonwebtoken'); const token = jwt.sign({ sub: '1234567890' }, 'mySuperSecretKey', { expiresIn: '1h' // 设置过期时间 }); console.log(token);
在生成 token 时,我们使用 jwt.sign 方法,将要传递的 payload 和密钥作为参数传入,并设置 expiresIn 选项来设置 token 的有效期。
验证 token
在上面的示例中,我们使用了 hapi-auth-jwt2 插件自带的验证方法,如果你想手动验证 token,你可以通过以下方式来实现:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------ - ------- ------- -- - --- - ----- ------- - ----------------- -------- ------ - -------- ----- ------- -- - ----- ----- - ------ - -------- ----- -- - -- ----- ------ - ------------- -------------------- --------------------
在验证 token 时,我们调用 jwt.verify 方法,并将 token 和密钥作为参数传入。如果验证通过,将返回一个包含 decoded 属性的对象,该属性包含了 token 的 payload 部分。
总结
在本文中,我们介绍了 JWT 的基本概念,并使用 hapi-auth-jwt2 插件来实现了 JWT 身份验证功能。同时,我们还学习了如何手动地生成和验证 token。这些知识可以帮助你更好地保护你的网站和 API,提高安全性,并保护用户的隐私。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f588fcf6b2d6eab3e47e36