gpt4 book ai didi

google-oauth - 如何使用 id token 的 at_hash 声明验证访问 token ?

转载 作者:行者123 更新时间:2023-12-04 17:56:27 24 4
gpt4 key购买 nike

假设我有以下来自 Google OAuth2 的回复 /token交换从 /auth 获得的代码后的端点端点( using this example OAuth Playground request ):

{
"access_token": "ya29.eQETFbFOkAs8nWHcmYXKwEi0Zz46NfsrUU_KuQLOLTwWS40y6Fb99aVzEXC0U14m61lcPMIr1hEIBA",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "1/ZagesePFconRc9yQbPxw2m1CnXZ5MNnni91GHxuHm-A",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjJhODc0MjBlY2YxNGU5MzRmOWY5MDRhMDE0NzY4MTMyMDNiMzk5NGIifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEwMTY5NDg0NDc0Mzg2Mjc2MzM0IiwiYXpwIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXRfaGFzaCI6ImFVQWtKRy11Nng0UlRXdUlMV3ktQ0EiLCJhdWQiOiI0MDc0MDg3MTgxOTIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJpYXQiOjE0MzIwODI4NzgsImV4cCI6MTQzMjA4NjQ3OH0.xSwhf4KvEztFFhVj4YdgKFOC8aPEoLAAZcXDWIh6YBXpfjzfnwYhaQgsmCofzOl53yirpbj5h7Om5570yzlUziP5TYNIqrA3Nyaj60-ZyXY2JMIBWYYMr3SRyhXdW0Dp71tZ5IaxMFlS8fc0MhSx55ZNrCV-3qmkTLeTTY1_4Jc"
}

我如何散列访问 token 以将其与 at_hash 进行比较声称 ID token ?

我可以在服务器上本地验证 ID token 以防止客户端修改,并希望验证访问 token 是与 id token 一起发布的 token (暗示受众和主题与 ID token 匹配)。

最佳答案

at_hash ID token 声明是 defined通过 OpenID Connect,如下所示:

Access Token hash value. Its value is the base64url encoding of the left-most half of the hash of the octets of the ASCII representation of the access_token value, where the hash algorithm used is the hash algorithm used in the alg Header Parameter of the ID Token's JOSE Header. For instance, if the alg is RS256, hash the access_token value with SHA-256, then take the left-most 128 bits and base64url encode them. The at_hash value is a case sensitive string.


c_hash混合流的 ID token 声明为 defined similarly ,可以使用相同的步骤进行验证。

生成 at_hash 的步骤或 c_hash从 token :
  • 使用相同的 alg 散列 token 的 ASCII 表示作为 ID token 本身,在 Google 的情况下为 SHA-256。
  • 将哈希截断为原始哈希值的前半部分
    (重要的是:不是哈希的字符串十六进制表示)。
  • Base64url 编码(无填充)截断的哈希字节。

  • 下面是一些用 python 创建哈希的示例代码,你需要两个库, pycryptogoogle-api-python-client (对于 base64 编码和 id token 比较,您可以用替代方法替代)。您可以像这样使用 pip 安装它们:
    pip install pycrypto
    pip install --upgrade google-api-python-client

    然后,运行 python以交互方式,并尝试以下操作:
    # Config: app's client id & tokens (in this case OAuth Playground's client id, and the tokens were extracted from the Token Endpoint response).
    client_id = "407408718192.apps.googleusercontent.com"
    id_token_string = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjcwZjZjNDI2NzkyNWIzMzEzNmExZDFjZmVlNGViYzU3YjI0OWU1Y2IifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXRfaGFzaCI6Iml5VkFfTnNtY2JJMDFHcFJDQVJaOEEiLCJhdWQiOiI0MDc0MDg3MTgxOTIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTAxNjk0ODQ0NzQzODYyNzYzMzQiLCJhenAiOiI0MDc0MDg3MTgxOTIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJpYXQiOjE0NjcyMTg1NzMsImV4cCI6MTQ2NzIyMjE3M30.e4hJJYeUaFVwJ9OC8LBnmOjwZln_E2-isEUJtb-Um7vt3GDZnBZkHdCokAPBL4OW3DXBNPk9iY0QL2P5Gpb-nX_s-PZKOIES8CE0i2DmGahCZgJY_Y3V2qwiP1fTEQjcUmHEG2e7OdCn6siSZveFQ0W7SiSbbSeJVLws9aoHROo_UXy8CVjaU5KinROG6m6igqCxFoskIWRzAynfx70xMadY4UdS8kbKK_v5id0_Rdg_gYlF1ND0lsPM9vdm3jOifQEAAkjHr-RuSDWlX4Bs4cQtEkeQkN6--MWhoqAshJITuGSazVIiDkVUNNBIXmB_dp9TO6ZjeQEEfeGCs6axKA"
    access_token = "ya29.Ci8QA5eGBdBglK59FXdqXIR5KnbMJs-swx6Alk6_AV_6YPkjhxdO1e0Hqxi-8NB3Ww"

    # Verifies & parses id token.
    idtoken = oauth2client.client.verify_id_token(id_token_string, client_id)

    # Token to hash & expected hash value (replace with code & c_hash to verify code).
    token_to_hash = access_token
    token_hash_expected = idtoken["at_hash"]

    # Step 1. hashes the access token using SHA-256 (Google uses `RS256` as the ID Token `alg`).
    hash = hashlib.sha256()
    hash.update(token_to_hash)
    digest = hash.digest() # this returns the hash digest bytes (not a hex string)

    # Step 2. truncates the hash digest to the first half.
    digest_truncated = digest[:(len(digest)/2)]

    # Step 3. base64url encodes the truncated hash digest bytes.
    token_hash_computed = oauth2client.crypt._urlsafe_b64encode(digest_truncated)

    # Compares computed to expected, outputs result.
    str("Computed at_hash: %s" % token_hash_computed)
    str(token_hash_computed == token_hash_expected)

    要使用您自己帐户中的新 ID token 尝试此示例,请使用 OAuth Playground 创建一个请求。与 profile范围(或使用 this one),交换刷新和访问 token 的代码,并将响应复制到 token_response_http_body在上面的示例中(删除换行符)。

    关于google-oauth - 如何使用 id token 的 at_hash 声明验证访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356460/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com