抱歉,最近身体不舒服,所以发帖晚了。上一篇文章中,我获取了一个日本邮政的数字地址,并将其用于日本邮政提供的运输标签创建应用程序。这次,我将通过 API 获取。“邮政编码/数字地址 API”页面由于它支持 OAuth 2.0 和 OpenID Connect,所以只能这样做。

获取 Yu-ID Biz

现在,要访问 Yu-ID API,您必须注册邮政编码/商业数字地址。进入注册页面后,您将看到以下屏幕。

看来您可以稍后更改用户名。输入合适的名称后,“注册”按钮会变黑并可按下,请按下。

然后,会出现机构注册的界面。看起来你既可以注册为公司,也可以注册为个体经营者。我两种都可以,但我决定选择公司选项,因为它有更多的输入字段。我碰巧也拥有一家名为 NAT Consulting LLC 的公司。

完成注册后,您将进入一个显示用户列表的屏幕。

此屏幕不仅显示了用户列表,还显示了组织所做的设置。在“服务”下,左侧菜单中提供了有关“邮政编码和数字地址 API”的页面以及“通过数字地址搜索地址”的页面。让我们直接进入我们要查找的“邮政编码和数字地址 API”页面。

单击打开菜单。

“系统列表”允许您查看已注册客户列表并注册客户。

在“测试 AI 凭证”中,您可以显示用于使用测试 API 的 client_id 和 client_secret。此外,还有测试 API 参考文档。您需要做的第一件事是创建一个客户端来调用测试 API,您在查看此文档时需要执行此操作。API 参考文档如下所示:

“下载”按钮似乎可以下载 OpenAPI 规范,但我无法下载。我希望这个问题能得到解决。

API 参考包含生产 API 参考。

使用指南包括如何处理“数字地址”数据的说明。

发行说明目前为空白。

数据源包含作为此 API 提供的数据的来源的 CSV 文件。

现在让我们尝试测试 API。

现在,让我们尝试访问测试 API,看看如何使用 OAuth 和 OpenID Connect。

获取访问令牌

根据文档,它似乎支持OAuth 2.0 [RFC6749] の客户端凭据授予 似乎只使用了上述方法。访问令牌是在上述方法中获取的,但通常它会在授权标头(服务器必须支持)中发送,或者作为请求正文中的参数发送,但它是以 JSON 格式在正文中发送的。

就是这样

{
"grant_type": "client_credentials",
"client_id": "Test_Client_Identifier_String",
"secret_key": "Test_Secret_Key"
}

OAuth 2.0 中没有定义这一点。专有规格顺便说一句,如果使用RFC6749中指定的方法发送,则会导致错误请求。

这不是唯一的唯一规范。在这种情况下,请求必须包含 x-forwarded-for。这也是一个唯一的扩展。我能理解这种感觉,但是……顺便说一句,没有具体说明应该输入什么。我认为可能是连接到此客户端的终端的 IP 地址。但是,根据 RFC7239,应该停止使用 x-forwarded-for,而应该使用 Forwarded。

顺便说一下,点击文档路径可以显示 API 端点。

考虑到这一点,我们向测试 API 发送请求,该请求可以从 API 文档中获取。

curl -X POST https://stub-qz73x.da.pf.japanpost.jp/api/v1/j/token \
  -H "Content-Type: application/json" \
  -H "X-Forwarded-For: 64.227.48.220" \
  -d '{
    "grant_type": "client_credentials",
    "client_id": "Test_Client_Identifier_String",
    "secret_key": "Test_Secret_Key"
  }'

如果你这样做,你会得到如下的回应:

{"token":"eyJhbGciOiJSU.中略.TmrM38fAf8cgNm1QAnf-j0YFQA",
"token_type":"jwt",
"expires_in":600,
"scope":"J1"}

哦,访问令牌是 JWT 格式的。其内容如下:

标题

{
  "alg": "RS256",
  "typ": "JWT"
}

Payload

{
  "iss": "JPD",
  "sub": "DGA TOKEN",
  "scope": "J1",
  "clientId": "Biz_DaPfJapanpost_MockAPI_j3QKS",
  "ec_id": "8aeaf147-112f-4127-8cbb-2eff08a8e161",
  "iat": 1742886316,
  "exp": 1742886916
}

看起来像这样。哦,类型很奇怪。RFC9068按照这个来说,类型应该是at+jwt。

另外,由于 iss 只是一个字符串,所以无法找到 JWK,因此无法验证。但这没什么问题,因为验证是由日本邮政自己进行的。我以为 sub 应该包含 client_id,但似乎并非如此,它是一个固定的字符串。

现在,我们尝试将数字地址解析为地址。

使用此访问令牌,我们现在向搜索端点发出 OAuth 请求。访问令牌可以在授权标头中发送。X-Forwarded-For 仍照常发送。测试 API 允许搜索三个测试数字地址(A3E7FK2、JN2LKS4、QN2GQX6)以及东京千代田区的邮政编码和单个商家的邮政编码。

使用 curl 后它看起来像这样。

curl -X GET https://stub-qz73x.da.pf.japanpost.jp/api/v1/searchcode/A7E2FK2 \
  -H "Authorization: Bearer eyJhbGci..中略..QAnf-j0YFQA" \
  -H "X-Forwarded-For: 64.227.48.220" \
  -H "Accept: application/json"

然后它会返回类似这样的信息:

{
	"page": 1,
	"limit": 1000,
	"count": 1,
	"searchtype": "dgacode",
	"addresses": [
		{
			"dgacode": "A7E2FK2",
			"zip_code": "100-0005",
			"pref_code": "13",
			"pref_name": "東京都",
			"pref_kana": null,
			"pref_roma": null,
			"city_code": "13101",
			"city_name": "千代田区",
			"city_kana": null,
			"city_roma": null,
			"town_name": "丸の内",
			"town_kana": null,
			"town_roma": null,
			"biz_name": null,
			"biz_kana": null,
			"biz_roma": null,
			"block_name": "2丁目7−2",
			"other_name": "部屋番号:サンプル1",
			"address": "東京都千代田区丸の内2丁目7−2部屋番号:サンプル1",
			"longitude": null,
			"latitude": null
		}
	]
}

嗯,响应不是 OpenID Connect UserInfo 响应,但是是唯一的。

顺便说一下,如果你指定了除上述三个之外的数字地址,

{
"request_id":"848f5369-56fb-4488-aecd-b82599a1b2f9",
"error_code":"404-1029-0001",
"message":"該当するデジアドがありませんでした"
}

然后回来。

访问生产环境

好的,这样就成功了,现在让我们尝试访问生产环境。

流程与测试相同,只是目的地、client_id 和 client_secret 有所变更。生产环境的 client_id 和 client_secret 可以通过在“系统列表”菜单中注册客户端获取。

要获取令牌,请访问 https://api.da.pf.japanpost.jp/api/v1/j/token 请将其更改为并请求。

curl -X POST https://api.da.pf.japanpost.jp/api/v1/j/token \
  -H "Content-Type: application/json" \
  -H "X-Forwarded-For: 64.227.48.220" \
  -d '{
    "grant_type": "client_credentials",
    "client_id": "クライアントID",
    "secret_key": "クライアントシークレット"
  }'

系统将返回一个访问令牌,请使用它来发起请求。返回结果将包含如上所示的 JSON 格式。您也可以指定邮政编码来代替数字地址。

  curl -X GET https://api.da.pf.japanpost.jp/api/v1/searchcode/6180000 \
  -H "Authorization: Bearer eyJhbGciOiJS..中略..wV0si0TiQ" \
  -H "X-Forwarded-For: 64.227.48.220" \
  -H "Accept: application/json"

するとこんなふうに帰ってきます。
{
  "page": 1,
  "limit": 1000,
  "count": 2,
  "searchtype": "zipcode",
  "addresses": [
    {
      "dgacode": null,
      "zip_code": "6180000",
      "pref_code": "26",
      "pref_name": "京都府",
      "pref_kana": "キョウトフ",
      "pref_roma": "KYOTO",
      "city_code": "26303",
      "city_name": "乙訓郡大山崎町",
      "city_kana": "オトクニグンオオヤマザキチョウ",
      "city_roma": "OTOKUNI-GUN OYAMAZAKI-CHO",
      "town_name": "",
      "town_kana": "",
      "town_roma": "",
      "biz_name": null,
      "biz_kana": null,
      "biz_roma": null,
      "block_name": null,
      "other_name": null,
      "address": null,
      "longitude": null,
      "latitude": null
    },
    {
      "dgacode": null,
      "zip_code": "6180000",
      "pref_code": "27",
      "pref_name": "大阪府",
      "pref_kana": "オオサカフ",
      "pref_roma": "OSAKA",
      "city_code": "27301",
      "city_name": "三島郡島本町",
      "city_kana": "ミシマグンシマモトチョウ",
      "city_roma": "MISHIMA-GUN SHIMAMOTO-CHO",
      "town_name": "",
      "town_kana": "",
      "town_roma": "",
      "biz_name": null,
      "biz_kana": null,
      "biz_roma": null,
      "block_name": null,
      "other_name": null,
      "address": null,
      "longitude": null,
      "latitude": null
    }
  ]
}

概括

所以,总结一下。

  1. 数字广告转换 APIRFC6749访问令牌 (Access Token) 是使用类似于客户端凭据授予的唯一规范获取的。此访问令牌是一个 JWT,但类型 RFC9068按照说明,不是at+jwt,而是JWT。
  2. 现在,使用获取的访问令牌RFC6750以这种格式发送代码,获取注册到数字地址的字符串(不一定是地址)。
    • 您可以注册任何字符串,例如,您可以注册类似“从东京收到一封信,上面写着‘你不存在’。我没有出现在镜子里,人们也没有注意到我。我悄悄地消失了。”作为地址。1。
  3. 我还没有找到任何类似于 OpenID Connect 的东西。
  4. 您还可以通过指定邮政编码而不是数字地址来获取地址。如果有重复,则会以数组形式返回多个地址。

顺便说一句,邮政编码重复的地方很多。据了解,重复的邮政编码多达1,341个。有些甚至跨县重复……这是怎么回事……?

脚注

  1. 嗯,OpenID Connect 中的地址声明也是如此。