【问题标题】:Apple Maps Web Snapshots API works only intermittentlyApple Maps Web Snapshots API 只能间歇性工作
【发布时间】:2020-02-04 03:39:37
【问题描述】:

我正在尝试使用 Apple 的 Maps Web 快照:

https://developer.apple.com/documentation/snapshots

我有一些 PHP 代码用于生成所需的签名。

<?php

$params = array();
if (isset($_GET["center"])) {
    $params[] = "center=" . $_GET["center"];
}
$params[] = "size=640x640";
$params[] = "scale=2";
$params[] = "teamId=<my team ID here>";
$params[] = "keyId=<my maps key here>";

$data = "/api/v1/snapshot?" . implode("&", $params);

$pkeyid = openssl_pkey_get_private("file://<my private key file here>.p8");

$signature = '';
openssl_sign($data, $signature, $pkeyid, 'sha256');

$url = ("https://snapshot.apple-mapkit.com" . $data . "&signature=" . base64_encode($signature));

openssl_free_key($pkeyid);

奇怪的行为是这样的......

通常,生成的 URL 将返回:

{"error":{"message":"Not Authorized","details":[]}}

但是,如果我生成更多的 URL,使用 完全相同的数据(导致每次签名略有不同),这些 URL 也将不起作用

但是,最终,如果我再试几次,最终其中一个 URL会起作用,并返回 PNG 快照。

更奇怪的是 - 在我找到一个有效的 URL 后,之前返回错误的所有早期 URL 现在也有效!

所以,我认为这不一定是代码中的错误,因为经过六次左右的试验,它不可避免地会起作用。

我认为 openssl_sign 方法可能有些奇怪,但我可以使用 https://kjur.github.io/jsrsasign/api/index.html 使用 JavaScript 签名实现重现这种完全相同的行为。

基本上,该 API 似乎只适用于每 5-6 个签名请求中的 1 个,这使得它非常不可用。

有什么想法吗?

【问题讨论】:

  • 我想您可以尝试显示一些 URL,尤其是因为我们没有输入数据来运行您的应用程序。不过,根据敏感度,您可能需要考虑用测试密钥替换您的私钥。

标签: javascript php encryption apple-maps


【解决方案1】:

您所做的一切都按预期工作,直至实际请求。

$url = ("https://snapshot.apple-mapkit.com" . $data . "&amp;signature=" . base64_encode($signature));

应该是:

$url = ("https://snapshot.apple-mapkit.com" . $data . "&amp;signature=" . urlencode(base64_encode($signature)));

这也是您有时只看到成功的原因 - 签名中的字符之前没有被转移。

【讨论】:

  • 我不是 OP,但有完全相同的问题。谢谢 - 我之前应该发现这一点,但花了一天的大部分时间想知道为什么代码有时会起作用,而其他时候却不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多