【发布时间】:2020-03-27 19:29:19
【问题描述】:
我正在使用从 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 的相关文档 here,标头上没有对 nonce 的引用——只是在有效负载上。
Q1:我在这里做错了什么?
Q2:假设 Microsoft 是将 nonce 放在错误位置的人(标头而不是有效负载),是否可以在将 nonce 传递给 jose 的身份验证库之前从标头(在服务器端)中删除它?这样做安全吗?
【问题讨论】:
标签: jwt jose microsoft-identity-platform