我们需要针对真实的东西测试我们的 Azure 代码,因此我们决定使用 Azurite。然而,Azurite 的文档记录了要使用的众所周知的测试连接字符串。然而,当我们尝试使用用户委托密钥测试自签名 SAS 令牌时,我们很快就遇到了困难。这是因为 Azurite 仅在启用 OAuth over HTTPS 时才会生成用户委托密钥。
虽然所有这些都记录在案很好(确实是一个较小的噩梦),但关于生成 OAuth 令牌的文档为零,Java SDK 可以使用该令牌来针对 Azurite 进行身份验证。
那么如何使用 OAuth 令牌针对 Azurite 进行身份验证?
不幸的是,这对于 Azurite 的 OAuth 功能来说是一个糟糕的设计,因为 OAuth 令牌是通过 Azurite 生成用户委托密钥的唯一方法之一(测试自签名 SAS 令牌所需)。由于生产令牌按原样被接受,因此我对自己的生产令牌进行了 MITM,并将其缩减为 Azurite 使用 Java SDK 接受的以下匿名令牌:
标题:
{
"typ": "JWT",
"alg": "RS256",
"x5t": "foo",
"kid": "foo"
}
有效负载:
{
"aud": "https://storage.azure.com",
"iss": "https://sts.windows.net/foo/",
"iat": 1734352522,
"nbf": 1734352522,
"exp": 2100000000,
"acr": "1",
"aio": "",
"altsecid": "1:live.com:foo",
"amr": [
"pwd"
],
"appid": "foo",
"appidacr": "0",
"email": "[email protected]",
"family_name": "foo",
"given_name": "foo",
"groups": [
"foo"
],
"idp": "live.com",
"idtyp": "user",
"ipaddr": "127.0.0.1",
"name": "foo",
"oid": "foo",
"puid": "",
"rh": "foo",
"scp": "user_impersonation",
"sub": "",
"tid": "foo",
"unique_name": "live.com#[email protected]",
"uti": "",
"ver": "1.0",
"xms_idrel": "16 5"
}
签名:
invalid_signature
通过使用 base64 编码每个部分,将它们拼接在一起作为标准 JWT 令牌:
<base64 version of header found above>.<base64 version of payload found above>.invalid_signature
我会粘贴整个令牌,但这可能会以某种方式在某处标记我的帐户。如果您使用的是 Java SDK,这就是我所拥有的:
val token = ""; // read the JWT token from somewhere;
val bsc = new BlobServiceClientBuilder();
...
bsc.credential(request -> Mono.just(new AccessToken(token, OffsetDateTime.MAX)));
...
PS:这是我的评论的副本:https://github.com/Azure/Azurite/issues/537#issuecomment-2545729784