You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否应使用Google Auth Token验证客户端?如何安全实现JWT验证?

Google Auth JWT认证:安全解码、签名验证与代码安全性分析

我正在为网站实现基于Google Auth的认证功能,用户登录成功后Google会返回JWT,需要完成以下操作:

  • 安全解码JWT Token
  • 使用对应公钥验证Token的签名(注:Google采用RS256算法签名,我们需用公钥验证,而非私钥)
  • 从Token负载中提取用户信息
    同时想确认当前实现的代码是否安全。

现有代码:

import jwt

def decode_jwt(token):
    try:
        decoded_token = jwt.decode(token, options={"verify_signature": False},algorithms=["RS256"])
        return decoded_token
    except jwt.ExpiredSignatureError:
        return "Token has expired"
    except jwt.InvalidTokenError:
        return "Invalid token"

jwt_token = ""
decoded_token = decode_jwt(jwt_token)
print(decoded_token)

当前代码的安全问题

你的代码完全不安全,核心问题在于设置了options={"verify_signature": False},直接跳过了JWT的签名验证。JWT的签名是防止Token被篡改或伪造的关键——Google用私钥签名Token,只有用对应公钥验证签名通过,才能确认Token确实来自Google且未被修改。跳过签名验证后,任何攻击者都可以伪造JWT冒充合法用户,你的服务会毫无防备地接受假Token。

另外,虽然代码捕获了ExpiredSignatureError和InvalidTokenError,但因为签名验证被关闭,这些错误检查实际上起不到任何安全作用——攻击者可以随意修改Token的过期时间,你的代码无法察觉。


安全的实现方案

要安全处理Google的JWT,需要遵循以下步骤:

  1. 获取Google的公钥:Google会动态更新签名公钥,可使用pyjwt的jwks_client自动获取和管理最新公钥。
  2. 开启签名验证:必须移除verify_signature: False的配置,传入正确公钥进行签名验证。
  3. 验证关键声明:除签名外,还需验证JWT中的iss(签发者,必须是accounts.google.com或https://accounts.google.com)、aud(受众,必须是你的Google OAuth客户端ID)、exp(过期时间)等声明,确保Token合法性。

完整安全代码示例

import jwt
from jwt import PyJWKClient

def decode_google_jwt(token, client_id):
    # 自动获取Google最新公钥
    jwks_url = "https://www.googleapis.com/oauth2/v3/certs"
    jwks_client = PyJWKClient(jwks_url)
    signing_key = jwks_client.get_signing_key_from_jwt(token)

    try:
        decoded_token = jwt.decode(
            token,
            signing_key.key,
            algorithms=["RS256"],
            audience=client_id,
            issuer=["accounts.google.com", "https://accounts.google.com"]
        )
        # 提取核心用户信息
        user_info = {
            "user_id": decoded_token.get("sub"),
            "email": decoded_token.get("email"),
            "full_name": decoded_token.get("name"),
            "avatar": decoded_token.get("picture")
        }
        return user_info
    except jwt.ExpiredSignatureError:
        return "Token has expired"
    except jwt.InvalidAudienceError:
        return "Invalid audience"
    except jwt.InvalidIssuerError:
        return "Invalid issuer"
    except jwt.InvalidTokenError:
        return "Invalid token"

# 使用示例
google_jwt_token = "Google返回的JWT字符串"
your_client_id = "你的Google OAuth客户端ID"
user_data = decode_google_jwt(google_jwt_token, your_client_id)
print(user_data)

关键安全要点

  • 永远不要关闭签名验证:这是JWT安全的核心,跳过验证等于完全失去Token的可信度。
  • 验证核心声明:aud确保Token是发给你的服务的,iss确保Token来自Google,exp确保Token未过期,这些验证缺一不可。
  • 动态获取公钥:Google的公钥会更新,使用PyJWKClient可自动获取最新公钥,避免公钥过期导致验证失败。

内容的提问来源于stack exchange,提问作者Hamza Shabbir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:05:07