JWT结构组成
- 头部(Header):通常由两部分组成,令牌的类型(如JWT)和使用的哈希算法,如HMAC SHA256或RSA。它以JSON格式表示,然后进行Base64Url编码。例如:
{
"alg": "HS256",
"typ": "JWT"
}
- 载荷(Payload):也是一个JSON对象,包含声明(claims),这些声明是关于实体(通常是用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss、exp、sub等)、公共声明和私有声明。例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
- 签名(Signature):要创建签名部分,需要使用编码后的头部、编码后的载荷、一个密钥(secret)和头部中指定的签名算法。例如,如果使用HMAC SHA256算法,签名将按如下方式创建:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
在GraphQL API集成中传递认证信息
- 客户端传递:客户端在请求GraphQL API时,通常将JWT放在HTTP请求头中,常见的是
Authorization
头,格式为Bearer <JWT>
。例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- 服务器验证:GraphQL服务器接收到请求后,从
Authorization
头中提取JWT,然后使用与生成JWT时相同的密钥和算法来验证签名的有效性。如果签名验证成功,服务器可以从载荷中提取用户相关信息(如用户ID、角色等),并基于这些信息进行授权决策,确定客户端是否有权执行请求的GraphQL操作。