gpt4 book ai didi

python - 验证 AAD Azure 中的 JWT access_token 失败

转载 作者:行者123 更新时间:2023-12-01 18:27:56 25 4
gpt4 key购买 nike

我需要验证我正在处理的服务的 azure jwt access_token。我们目前正在向 https://graph.microsoft.com/beta/me 提出请求。如果请求成功,则 token 有效。不幸的是,我们将无法继续这样做。

为此我尝试了多种想法。他们都没有成功。即使 jwt.io 也无法识别该签名,即使 jwt kidkid 来自 jwk_uri 中的可用签名之一。匹配。

基于此博客post我创建了以下解决方案 (also available on github) .

我的实现与博客文章非常相似,但有一些更改:

#!/usr/bin/env python2

import jwt
import requests
import sys

from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend


def get_public_key(access_token):
""" Retrieve public key for access token """
token_header = jwt.get_unverified_header(access_token)

res = requests.get('https://login.microsoftonline.com/common/.well-known/openid-configuration')
jwk_uri = res.json()['jwks_uri']

res = requests.get(jwk_uri)
jwk_keys = res.json()

x5c = None
# Iterate JWK keys and extract matching x5c chain
for key in jwk_keys['keys']:
if key['kid'] == token_header['kid']:
x5c = key['x5c']
break
else:
raise Exception('Certificate not found in {}'.format(jwk_uri))

cert = ''.join([
'-----BEGIN CERTIFICATE-----\n',
x5c[0],
'\n-----END CERTIFICATE-----\n',
])
try:
public_key = load_pem_x509_certificate(cert.encode(), default_backend()).public_key()
except Exception as error:
raise Exception('Failed to load public key:', error)

return public_key, key['kid']

def main():
print '\n'
if len(sys.argv) < 2 or '-h' in sys.argv:
print 'Run it again passing acces token:\n\tpython jwt_validation.py <access_token>'
sys.exit(1)

access_token = sys.argv[1]
audience = 'https://graph.microsoft.com'

public_key, kid = get_public_key(access_token)

try:
jwt.decode(
access_token,
public_key,
algorithms='RS256',
audience=audience,
)
except Exception as error:
print 'key {} did not worked, error:'.format(kid), error
sys.exit(1)

print('Key worked!')

if __name__ == '__main__':
main()

此解决方案返回有效 access_token 的无效签名,并具有以下回溯:

Traceback (most recent call last):
File "jwt_validation/jwt_validation.py", line 63, in <module>
main()
File "jwt_validation/jwt_validation.py", line 57, in main
audience=audience,
File "~/.pyenv/versions/jwt-validation-tool/lib/python2.7/site-packages/jwt/api_jwt.py", line 93, in decode
jwt, key=key, algorithms=algorithms, options=options, **kwargs
File "~/.pyenv/versions/jwt-validation-tool/lib/python2.7/site-packages/jwt/api_jws.py", line 157, in decode
key, algorithms)
File "~/.pyenv/versions/jwt-validation-tool/lib/python2.7/site-packages/jwt/api_jws.py", line 224, in _verify_signature
raise InvalidSignatureError('Signature verification failed')
jwt.exceptions.InvalidSignatureError: Signature verification failed

任何关于我可能出错的想法都会有帮助。

最佳答案

我遇到了类似的问题,经过几天的调查,我发现在我的案例中,我正在请求具有内置范围(openid 和配置文件)的 token ,并且没有任何自定义范围,这会导致发行具有不同受众的 token (MS Graph),因此使用不同的公钥签名的 token (因为我认为发布的 access_token 只是委托(delegate)的 MS Graph 范围的转发)。

我通过在应用注册(公开 API 部分)中添加自定义范围解决了该问题,现在我的 access_token 已向有效受众颁发,并且我可以使用我的应用公钥检查签名。

关于python - 验证 AAD Azure 中的 JWT access_token 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509774/

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