我正在使用从 Microsoft 到客户端的 jwt 令牌来验证从它到 Web API(服务器)的请求。我可以控制客户端(js)和服务器(Python)的代码。
在客户端,我使用以下请求获取令牌(用户通过租户上的密码/2FA 声明):
`https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/authorize
?response_type=id_token+token
&client_id=${CLIENT_ID}
&redirect_uri=${redirect_uri}
&scope=openid+email+profile
&state=${guid()}
&nonce=${guid()}`
这里guid
有一个独特的价值,TENANT_ID
是租户,CLIENT_ID
也是客户。
获得此令牌后,我将其作为授权标头发送,如下所示:
init = {
headers: {
'Authorization': `Bearer ${token}`,
}
}
return fetch(url, init).then(response => {
return response.json()
})
然后在服务器上检索令牌并验证它:
if 'Authorization' in request.headers and request.headers['Authorization'].startswith('Bearer '):
token = request.headers['Authorization'][len('Bearer '):]
from authlib.jose import jwt
claims = jwt.decode(token, jwk)
jwk
的内容在哪里https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys
。
整个流程一直有效,直到验证失败,并出现以下错误:
authlib.jose.errors.InvalidHeaderParameterName: invalid_header_parameter_name: Invalid Header Parameter Names: nonce
这表明令牌的标头包含一个密钥nonce
(我验证了它)。
在此处查看Microsoft 的文档,标头上没有对 anonce
的引用——只是在有效负载上。
Q1:我在这里做错了什么?
Q2:假设微软是把 nonce 放在错误的地方(头而不是有效负载)的人,是否可以在将 nonce 传递给 jose 的身份验证库之前从头(在服务器端)中删除它?这样做安全吗?