抱歉,最近身体不舒服,所以发帖晚了。上一篇文章中,我获取了一个日本邮政的数字地址,并将其用于日本邮政提供的运输标签创建应用程序。这次,我将通过 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
}
]
}
概括
所以,总结一下。
- 数字广告转换 APIRFC6749访问令牌 (Access Token) 是使用类似于客户端凭据授予的唯一规范获取的。此访问令牌是一个 JWT,但类型 RFC9068按照说明,不是at+jwt,而是JWT。
- 现在,使用获取的访问令牌RFC6750以这种格式发送代码,获取注册到数字地址的字符串(不一定是地址)。
- 您可以注册任何字符串,例如,您可以注册类似“从东京收到一封信,上面写着‘你不存在’。我没有出现在镜子里,人们也没有注意到我。我悄悄地消失了。”作为地址。1。
- 我还没有找到任何类似于 OpenID Connect 的东西。
- 您还可以通过指定邮政编码而不是数字地址来获取地址。如果有重复,则会以数组形式返回多个地址。
顺便说一句,邮政编码重复的地方很多。据了解,重复的邮政编码多达1,341个。有些甚至跨县重复……这是怎么回事……?
