javascript - Apple Maps Web Snapshots API 仅间歇性工作

标签 javascript php encryption apple-maps

我正在尝试使用 Apple 的 map 网络快照:

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 方法可能有些奇怪,但我可以使用 JavaScript 签名实现重现完全相同的行为,使用 https://kjur.github.io/jsrsasign/api/index.html .

本质上,该 API 似乎只适用于每 5-6 个签名请求中的 1 个,这使得它几乎无法使用。

有什么想法吗?

最佳答案

您所做的一切都按预期进行,符合实际要求。

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

应该是:

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

这也是您有时只能看到成功的原因 - 签名中的字符之前未传输。

关于javascript - Apple Maps Web Snapshots API 仅间歇性工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259445/

相关文章:

javascript - 当 Windows 进入休眠模式然后唤醒时,setTimeout 不起作用

javascript - 如何扩展 Ivan Sanchez 的 Leaflet.Polyline.SnakeAnim 以支持 'snakepause' 和 'snakeplay' 事件

php - 我的 PHP 脚本缓存(公共(public))友好吗?

php - 基于 now() 时间戳将学年保存到 MySQL 数据库?

java - 无法在Android中使用apache poi解密excel文件

Javascript url 验证允许相对和绝对 url

javascript - find 不适用于类名

php - mysql根据检查用特定文本替换列

c# - Rijndael:C++加密,C#解密

mysql - 如何在MySQL数据库中存储AES加密信息