PHP使用JWT(JSON Web Tokens)鉴权——什么是JWT

时间:2022-06-16作者:klpeng分类:PHP浏览:196评论:1

什么是JWT?

PHP使用JWT(JSON Web Tokens)鉴权——什么是JWT


JWT ( JSON Web Tokens) 越来越多地被用作对服务器请求进行身份验证的一种方式。

与 API 密钥相比,JWT 具有许多优势,包括:


    API 密钥是随机字符串,而 JWT 包含信息和元数据。

    JWT 不需要集中的发行或撤销机构。

    JWT 与 OAUTH2 兼容。

    可以检查 JWT 数据。 

    JWT 有过期控制。

    JWT 适用于空间受限的环境,例如 HTTP 授权标头。

    数据以 JavaScript Object Notation 格式 (JSON) 传输。

    JWT 使用Base64url 编码表示。


这是一个示例 JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E

一个JWT字符串包含三个单独的字符串:


JWT header头

第一个字符串是 JWT 标头。它是一个Base64、URL 编码的 JSON 字符串。它指定了用于生成签名的加密算法,以及令牌的类型,该类型始终设置为JWT。该算法可以是对称的或非对称的。

对称算法使用单个密钥来创建和验证令牌。密钥在 JWT 的创建者和它的消费者之间共享。您必须确保只有创建者和消费者知道秘密。否则,任何人都可以创建有效的令牌。

非对称算法使用私钥对令牌进行签名,并使用公钥对其进行验证。当共享秘密不切实际或其他方只需要验证令牌的完整性时,应使用这些算法。


JWT 的有效载荷(Payload)

第二个字符串是 JWT 的有效载荷。它也是一个 Base64、URL 编码的 JSON 字符串。它包含一些标准字段,称为“声明”。有三种类型的声明:注册的、公共的和私有的。

注册的索赔是预定义的。您可以在JWT 的 RFC中找到它们的列表。以下是一些常用的:


    iat:令牌发行的时间戳。

    key:一个唯一的字符串,可用于验证令牌,但与没有集中的发行者权限相违背。

    iss: 包含发行者名称或标识符的字符串。可以是域名,可用于丢弃来自其他应用程序的令牌。  

    nbf:令牌应该开始被认为有效的时间戳。应该等于或大于iat。

    exp:令牌应停止有效的时间戳。应该大于iat和nbf。


可以按照您认为合适的方式定义公共声明。但是,它们不能与已注册的声明或已存在的公共声明相同。


JWT 的签名

JWT 的签名是一种加密机制,旨在使用令牌内容独有的数字签名来保护 JWT 的数据。签名确保 JWT 的完整性,以便消费者可以验证它没有被恶意行为者篡改。


JWT 的签名是三件事的组合:

    JWT 的标头

    JWT 的有效载荷

    一个秘密的值

    

这三个使用 JWT 标头中指定的算法进行数字签名(未加密)。如果我们对上面的示例进行解码,我们将得到以下 JSON 字符串:

JWT 的标头:

{
    "alg": "HS256",
    "typ": "JWT"
}

JWT 的数据:

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}



文章原创出自 彭超的博客 | 深入研究web系统架构 https://ligphp.com/

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢