在 Javascript 中有可见的 Google 驱动器 API 键是否安全?
Is it safe to have visible Google Drive API keys in Javascript?
我正在使用 Google 驱动器 API 从 Google 驱动器下载文件。为此,我正在使用 Javascript。在 JS 中使用可见的 API 键是否安全,或者我应该使用 Node.js 或其他东西?正如您在代码顶部看到的那样,有许多密钥(开发人员密钥、客户端 ID 和应用程序 ID)。我的代码中有漏洞吗?
这是我的代码:
var developerKey = '[key]';
var clientId = "[key]"
var appId = "[key]";
var scope = ['https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive'];
var pickerApiLoaded = false;
var driveLoaded = false;
var oauthToken;
// Use the Google API Loader script to load the google.picker script.
function loadPicker() {
gapi.load('auth', {'callback': onAuthApiLoad});
gapi.load('picker', {'callback': onPickerApiLoad});
gapi.load('client', function () {
gapi.client.load('drive', 'v2', function () {
driveLoaded = true;
});
});
}
function onAuthApiLoad() {
window.gapi.auth.authorize(
{
'client_id': clientId,
'scope': scope,
'immediate': false
},
handleAuthResult);
}
function onPickerApiLoad() {
pickerApiLoaded = true;
createPicker();
}
function handleAuthResult(authResult) {
if (authResult && !authResult.error) {
oauthToken = authResult.access_token;
createPicker();
}
}
// Create and render a Picker object for searching images.
function createPicker() {
if (pickerApiLoaded && oauthToken) {
var view = new google.picker.View(google.picker.ViewId.DOCS);
view.setMimeTypes("application/sla,application/vnd.ms-pki.stl,application/x-navistyle");
var picker = new google.picker.PickerBuilder()
.enableFeature(google.picker.Feature.NAV_HIDDEN)
.enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
.setAppId(appId)
.setOAuthToken(oauthToken)
.addView(view)
.addView(new google.picker.DocsUploadView())
.setDeveloperKey(developerKey)
.setCallback(pickerCallback)
.build();
picker.setVisible(true);
}
}
// A simple callback implementation.
function pickerCallback(data) {
if (data.action == google.picker.Action.PICKED) {
var fileId = data.docs[0].id;
downloadFile(fileId, data.docs[0].name);
}
}
function downloadFile(fileId, fileName)
{
var request = gapi.client.drive.files.get({
fileId:fileId,
alt:"media"
}).then(function(resp){
$.post("PHP/save_file.php", {Type: "stl", Filename: fileName, Data: resp.body}, function(response) {
if (response == "OK")
{
}
});
});
}
function showPickerDialog(){
loadPicker()
}
当您在 Google 开发者控制台上创建应用程序时,您创建了一个 Web 应用程序。创建它时,您添加了一个 javascript 来源。只要您将此 javascript 来源设置为应用程序 运行 所在的网络服务器的位置,那么任何人都无法使用您的客户端 ID。如果您将其设置为本地主机,那么是的,有人可能会劫持您的令牌并使用它。
至于 api 密钥,您应该将其锁定到特定域,但是 api 密钥只允许您读取 public 数据。 Google 驱动器中的 public 数据量,但如果您不锁定它,有人可能会滥用您的 api 密钥。
我正在使用 Google 驱动器 API 从 Google 驱动器下载文件。为此,我正在使用 Javascript。在 JS 中使用可见的 API 键是否安全,或者我应该使用 Node.js 或其他东西?正如您在代码顶部看到的那样,有许多密钥(开发人员密钥、客户端 ID 和应用程序 ID)。我的代码中有漏洞吗?
这是我的代码:
var developerKey = '[key]';
var clientId = "[key]"
var appId = "[key]";
var scope = ['https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive'];
var pickerApiLoaded = false;
var driveLoaded = false;
var oauthToken;
// Use the Google API Loader script to load the google.picker script.
function loadPicker() {
gapi.load('auth', {'callback': onAuthApiLoad});
gapi.load('picker', {'callback': onPickerApiLoad});
gapi.load('client', function () {
gapi.client.load('drive', 'v2', function () {
driveLoaded = true;
});
});
}
function onAuthApiLoad() {
window.gapi.auth.authorize(
{
'client_id': clientId,
'scope': scope,
'immediate': false
},
handleAuthResult);
}
function onPickerApiLoad() {
pickerApiLoaded = true;
createPicker();
}
function handleAuthResult(authResult) {
if (authResult && !authResult.error) {
oauthToken = authResult.access_token;
createPicker();
}
}
// Create and render a Picker object for searching images.
function createPicker() {
if (pickerApiLoaded && oauthToken) {
var view = new google.picker.View(google.picker.ViewId.DOCS);
view.setMimeTypes("application/sla,application/vnd.ms-pki.stl,application/x-navistyle");
var picker = new google.picker.PickerBuilder()
.enableFeature(google.picker.Feature.NAV_HIDDEN)
.enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
.setAppId(appId)
.setOAuthToken(oauthToken)
.addView(view)
.addView(new google.picker.DocsUploadView())
.setDeveloperKey(developerKey)
.setCallback(pickerCallback)
.build();
picker.setVisible(true);
}
}
// A simple callback implementation.
function pickerCallback(data) {
if (data.action == google.picker.Action.PICKED) {
var fileId = data.docs[0].id;
downloadFile(fileId, data.docs[0].name);
}
}
function downloadFile(fileId, fileName)
{
var request = gapi.client.drive.files.get({
fileId:fileId,
alt:"media"
}).then(function(resp){
$.post("PHP/save_file.php", {Type: "stl", Filename: fileName, Data: resp.body}, function(response) {
if (response == "OK")
{
}
});
});
}
function showPickerDialog(){
loadPicker()
}
当您在 Google 开发者控制台上创建应用程序时,您创建了一个 Web 应用程序。创建它时,您添加了一个 javascript 来源。只要您将此 javascript 来源设置为应用程序 运行 所在的网络服务器的位置,那么任何人都无法使用您的客户端 ID。如果您将其设置为本地主机,那么是的,有人可能会劫持您的令牌并使用它。
至于 api 密钥,您应该将其锁定到特定域,但是 api 密钥只允许您读取 public 数据。 Google 驱动器中的 public 数据量,但如果您不锁定它,有人可能会滥用您的 api 密钥。