Использование JavaScript в облачном хранилище Google
Я пытаюсь загрузить изображения в корзины в облачном хранилище Google с помощью JSON API, используя образец Javascript: пример Api Javascript
Я могу загрузить фотографии, но он просит меня войти в свою учетную запись Google.
В примере есть кнопка авторизации, которая, как я понимаю, управляет учетными данными OAuth.
function checkAuth() {
gapi.auth.authorize({
client_id: clientId,
scope: scopes,
immediate: true
}, handleAuthResult);
}
Проблема в:
Я хочу пройти аутентификацию без всплывающего экрана, то есть без входа в систему с Google. Поскольку мой клиент не знает адрес электронной почты или пароль, я хочу, чтобы он был автоматически.
Как мне этого добиться?
Спасибо!
-----------------------------ОБНОВИТЬ--------------------
Поэтому, следуя ответу Брэндона, я сделал следующее:
Я создал свой программный документ и подписал его так:
var http = require('http');
var fs = require('fs');
var crypto = require('crypto');
var express = require('express');
var app = express();
var p12ToPem = require("./node_modules/p12-to-pem/p12ToPem.js");
var p12File = fs.readFileSync("./KEY.p12");
var pemKey = p12ToPem(p12File, "notasecret");
var policyJson={"expiration": "2050-06-16T11:11:11Z",
"conditions": [["starts-with", "$key", "" ],
{"acl": "bucket-owner-read" },
{"bucket": "my-bucket'name"},
{"success_action_redirect":"http://www.example.com/success_notification.html" },
["eq", "$Content-Type", "image/jpeg" ],
["content-length-range", 0, 1000000]
]
};
var policyJson64 = new Buffer(''+policyJson).toString('base64');
var sign = crypto.createSign('RSA-SHA256');
sign.update(policyJson64);
var sig = sign.sign(pemKey, 'base64')
console.log("policyJson64:"+policyJson64);
console.log("sig:"+sig);
И моя форма сообщения следующая:
<form action="http://my-bucket-name.storage.googleapis.com" method="post" enctype="multipart/form-data">
<input type="text" name="key" value="">
<input type="hidden" name="bucket" value="my-bucket-name">
<input type="hidden" name="Content-Type" value="image/jpeg">
<input type="hidden" name="GoogleAccessId" value="884257827820-so77htet9tafrcjjp83m7api9lh12qsn@developer.gserviceaccount.com">
<input type="hidden" name="acl" value="bucket-owner-read">
<input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html">
<input type="hidden" name="policy" value="DONT KNOW WHAT TO PUT HERE">
<input type="hidden" name="signature" value="NEITHER HERE">
<input name="file" type="file">
<input type="submit" value="Upload">
Независимо от того, какие комбинации получены в javascrypt, я не могу понять, что входит в политику, а что в подпись, и ДА! Я прочитал API, но неясно, что происходит с этими двумя входами. Я попытался ввести на входе политики значение PolicyJson64 и sig. И я попытался поставить на входе подписи значения sig и pemKey тоже.
Я получаю эту ошибку:
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
</Message>
<StringToSign>
a/vDHoeJ1jIZibjgLnS/ZfMftmyz8IaISJiVt1b2wDNbDjnSR+0HyEDW9/Lew7ufMjU9xdtX/Uld06IJbeYz3OWGHnH4osJNS614RoDVd7lq2qft+bSCqYPtkagJiUWs9SNOPvuQzISthqloPQOwJ1LLXHYmV52c73OpexAnSR4=
</StringToSign>
</Error>
Что я должен поставить?
------ОБНОВИТЬ------
Пожалуйста, не копируйте вставку документации, которая не помогает. Щедрость добавлена
2 ответа
Поскольку у Google Cloud Storage нет простого способа загрузки изображения (2014), я в конечном итоге использовал Amazon Web Services, который даже поставляется с примером кода NodeJS. Легко и просто в использовании.
http://aws.amazon.com/es/developers/getting-started/nodejs/
Клонировать образец:
git clone https://github.com/awslabs/aws-nodejs-sample.git
Установка:
npm install
Бежать:
node sample.js
Образец поставляется с использованием корзины, и они даже хранят файл в корзине. Так что это будет сделано. Убедитесь, что изменили свои учетные данные:
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
Ура!
Для загрузки объекта требуется некоторая форма авторизации (вы также можете создать корзину, которая разрешает действительно анонимные записи, но это редко хорошая идея). Есть несколько способов получить авторизацию.
Один из способов, как вы обнаружили, состоит в том, чтобы пользователь вошел в свою учетную запись Google и использовал это в качестве авторизации. Это хороший вариант, если приложение предназначено для небольшого числа известных людей.
Другой способ загрузки изображений - использовать подписанные URL-адреса или документы политики с подписанной формой. Это позволяет вашим пользователям использовать стандартную HTML-форму для выбора и загрузки изображения, предварительно авторизованного вашим приложением. Документ политики представляет собой небольшой текст, который описывает, что пользователю разрешено делать, и был подписан соответствующими учетными данными.
Вот пример документа политики:
{"expiration": "2010-06-16T11:11:11Z",
"conditions": [
["starts-with", "$key", "" ],
{"acl": "bucket-owner-read" },
{"bucket": "travel-maps"},
{"success_action_redirect": "http://www.example.com/success_notification.html" },
["eq", "$Content-Type", "image/jpeg" ],
["content-length-range", 0, 1000000]
]
}
В этом документе указывается, что пользователи могут использовать его только для загрузки объектов с ACL-списком для чтения с ведром, только для загрузок в "путевые карты", могут загружать только объекты размером до 1 мегабайта и т. Д. Затем сервер подпишет этот документ, используя свой секретный ключ. Затем документ (в базе 64) и его подпись будут включены в HTML-форму, например:
<form action="http://travel-maps.storage.googleapis.com" method="post" enctype="multipart/form-data">
<input type="text" name="key" value="">
<input type="hidden" name="bucket" value="travel-maps">
<input type="hidden" name="Content-Type" value="image/jpeg">
<input type="hidden" name="GoogleAccessId" value="1234567890123@developer.gserviceaccount.com">
<input type="hidden" name="acl" value="bucket-owner-read">
<input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html">
<input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjogIjIwMTAtMDYtMTZUMTE6MTE6MTFaIiwNCiAiY29uZGl0aW9ucyI6IFsNCiAgWyJzdGFydHMtd2l0aCIsICJrZXkiLCAiIiBdLA0KICB7ImFjbCI6ICJidWNrZXQtb3duZXItcmVhZCIgfSwNCiAgeyJidWNrZXQiOiAidHJhdmVsLW1hcHMifSwNCiAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N1Y2Nlc3Nfbm90aWZpY2F0aW9uLmh0bWwiIH0sDQogIFsiZXEiLCAiQ29udGVudC1UeXBlIiwgImltYWdlL2pwZWciIF0sDQogIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCAxMDAwMDAwXQ0KICBdDQp9">
<input type="hidden" name="signature" value="BSAMPLEaASAMPLE6SAMPLE+SAMPPLEqSAMPLEPSAMPLE+SAMPLEgSAMPLEzCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw=">
<input name="file" type="file">
<input type="submit" value="Upload">
</form>
Здесь гораздо больше документации о том, как это работает:
https://cloud.google.com/storage/docs/reference-methods
Имейте в виду, что подписанный URL-адрес отличается от подписанной формы. "Подписанные URL-адреса" являются очень конкретными, произвольными командами, которые могут выполняться точно так, как указано. Вы можете использовать их для загрузки, но они менее универсальны, чем подписанные документы политики.