使用 OAuth 通过 Java SDK 示例对 Azurite 进行身份验证

问题描述 投票:0回答:1

我们需要针对真实的东西测试我们的 Azure 代码,因此我们决定使用 Azurite。然而,Azurite 的文档记录了要使用的众所周知的测试连接字符串。然而,当我们尝试使用用户委托密钥测试自签名 SAS 令牌时,我们很快就遇到了困难。这是因为 Azurite 仅在启用 OAuth over HTTPS 时才会生成用户委托密钥。

虽然所有这些都记录在案很好(确实是一个较小的噩梦),但关于生成 OAuth 令牌的文档为零,Java SDK 可以使用该令牌来针对 Azurite 进行身份验证。

那么如何使用 OAuth 令牌针对 Azurite 进行身份验证?

java azure storage azurite
1个回答
0
投票

不幸的是,这对于 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

© www.soinside.com 2019 - 2024. All rights reserved.