如何在 JavaScript 中生成有效签名,我确实有业务密钥和客户端 ID,但无法继续进行静态映射 api 有效 url 签名,因为我正在使用 JavaScript 调用此 API 并希望发送签名和客户端 ID 以获得完整利用我的使用限制。
问问题
4702 次
4 回答
3
这是 Google 在其文档中提供的用于签署静态地图 URL 的示例 Javascript (node.js) 代码的链接:
https://github.com/googlemaps/url-signing/blob/gh-pages/urlSigner.js
我已经将这段代码变成了gmaps-url-signer节点/npm 模块。这是您可以使用它使用 gmaps-url-signer 库对静态地图 URL 进行签名的方法:
const urlSigner = require('gmaps-url-signer');
const key = 'my_google_api_key';
const secret = 'my_static_maps_secret';
const domain = 'http://maps.googleapis.com';
// Path to your static map
let path = '/maps/api/staticmap?zoom=2&scale=1&size=350x250&maptype=terrain&format=png&visual_refresh=true';
path += `&key=${key}`;
console.log('Full signed URL:');
console.log(domain + urlSigner.sign(path, secret));
于 2018-10-11T13:45:19.013 回答
2
Google 的 URL 签名示例
包括以下语言的示例,包括 Node/JS:
- Python
- 爪哇
- 节点/JS
- PHP
- C#
- Perl
- 红宝石
- VB.NET
- Objective-C
对于 Node/JS,它看起来像这样:
'use strict'
const crypto = require('crypto');
const url = require('url');
/**
* Convert from 'web safe' base64 to true base64.
*
* @param {string} safeEncodedString The code you want to translate
* from a web safe form.
* @return {string}
*/
function removeWebSafe(safeEncodedString) {
return safeEncodedString.replace(/-/g, '+').replace(/_/g, '/');
}
/**
* Convert from true base64 to 'web safe' base64
*
* @param {string} encodedString The code you want to translate to a
* web safe form.
* @return {string}
*/
function makeWebSafe(encodedString) {
return encodedString.replace(/\+/g, '-').replace(/\//g, '_');
}
/**
* Takes a base64 code and decodes it.
*
* @param {string} code The encoded data.
* @return {string}
*/
function decodeBase64Hash(code) {
// "new Buffer(...)" is deprecated. Use Buffer.from if it exists.
return Buffer.from ? Buffer.from(code, 'base64') : new Buffer(code, 'base64');
}
/**
* Takes a key and signs the data with it.
*
* @param {string} key Your unique secret key.
* @param {string} data The url to sign.
* @return {string}
*/
function encodeBase64Hash(key, data) {
return crypto.createHmac('sha1', key).update(data).digest('base64');
}
/**
* Sign a URL using a secret key.
*
* @param {string} path The url you want to sign.
* @param {string} secret Your unique secret key.
* @return {string}
*/
function sign(path, secret) {
const uri = url.parse(path);
const safeSecret = decodeBase64Hash(removeWebSafe(secret));
const hashedSignature = makeWebSafe(encodeBase64Hash(safeSecret, uri.path));
return url.format(uri) + '&signature=' + hashedSignature;
}
于 2018-12-16T23:14:30.700 回答
1
Google 不建议使用 JavaScript 对 URL 进行签名,因为它会将加密密钥暴露给用户。
您可以在此链接中看到:
https://developers.google.com/maps/documentation/business/faq#signature_jses
于 2013-12-09T17:11:17.270 回答
1
如果你的意思是你有一个 Javascript 服务器(NodeJS/Meteor)并且想要获取签名的 URL,我使用这个包。
于 2017-01-26T04:00:04.360 回答