AMP更新 - 缓存请求返回403

时间:2017-09-12 12:27:47

标签: java spring sha256 amp-html rsa-sha256

我正在尝试使用this documentation实现Google AMP更新缓存请求。

我的实施

正如本教程中所建议的那样,首先我从https://cdn.ampproject.org/caches.json获取缓存信息,然后迭代这些缓存以执行更新。

单缓存的简化代码(因为目前只有一个缓存):

主要逻辑

String firstPartUrl = "https://amp--frontend-dpo-styria--publishing-com.cdn.ampproject.org"
String secondPartUrl = "/update-cache/c/s/amp-frontend.dpo.styria-publishing.com/octopus/5267614?amp_action=flush&amp_ts=1505218616"

secondPartUrl = signRequestUrl(secondPartUrl);

performRequest(firstPartUrl, secondPartUrl);

签名功能

private String signRequestUrl(String requestUrl) throws Exception {
    URL url = Resources.getResource("rsa/private-key-pcks8.pem");
    String privateKey = Resources.toString(url, Charsets.UTF_8);

    String signature = signSHA256RSA(requestUrl, privateKey);

    StringBuilder builder = new StringBuilder(requestUrl);
    builder.append("&amp_url_signature=");
    builder.append(signature);
    return builder.toString();
}

public static String signSHA256RSA(String input, String privateKey) throws Exception {
    // Remove markers and new line characters in private key
    String realPK = privateKey.replaceAll("-----END PRIVATE KEY-----", "")
            .replaceAll("-----BEGIN PRIVATE KEY-----", "")
            .replaceAll("\r\n", "")//windows
            .replaceAll("\n", "");//unix

    byte[] b1 = Base64.getDecoder().decode(realPK);
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b1);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    Signature privateSignature = Signature.getInstance("SHA256withRSA");
    privateSignature.initSign(kf.generatePrivate(spec));
    privateSignature.update(input.getBytes());
    byte[] s = privateSignature.sign();
    return Base64.getUrlEncoder().withoutPadding().encodeToString(s);
}

我的公钥发布在此处:https://amp-frontend.dpo.styria-publishing.com/.well-known/amphtml/apikey.pub

应用生成的网址如下所示: https://amp--frontend-dpo-styria--publishing-com.cdn.ampproject.org/update-cache/c/s/amp-frontend.dpo.styria-publishing.com/octopus/5267614?amp_action=flush&amp_ts=1505218616&amp_url_signature=YiQ_ZEXq-FyoTQfk4YdL-n3rR0JqF6PQ8J86iCBcyNFino7t5_zSSqLR4vDoNz6o9Bj_5UbYFdpRa-J04MoL_-mizxo6M8OftcgbKjBNfgvXjG4SIzKZGxVWkBIWBLAoaEXqnkAeEsyyjBAxmX7Z3O4_GAY77Rqdb4vGKtbszSK5QHKmHAzRRYUnu2wMlYkPNTA_3yyHaZZPs0cRpksrDHLABZbGKgluMtL1lbKPSye1XK_9PBneATiSmSKlxuIyVqeFWlxwMgzEY5gz9QZCR0Tv1GvOZv6dAgqXnVR9t2vb2OYNqrR0_WO9BuNwpRu3Sz1OA1_FuukbL5G41cuj2w

我尝试了什么

我甚至尝试按照命令行中的签名步骤进行操作,但即使在此之后,我获得的URL也返回403.

我尝试了以下来自this question的提示(确保我使用SHA256并将apikey的内容类型设置为text / plain,但它没有帮助)

我的问题

你知道为什么Google AMP仍然会返回403吗?我怀疑,我的Base64编码可能存在问题,因为documentation对此并不十分清楚,但我不确定。

修改

我意识到功能构建secondPartUrl的实现可能存在问题 - 特别是时间戳。我使用ZonedDateTime.now()创建了时间戳,这显然是错误的,因为我在与UTC不同的时区。但是,将其更改为Instant.now()并没有帮助。

0 个答案:

没有答案