403 статус из облачной функции Firebase -> Google Книги API
В настоящее время я работаю над созданием облачной функции Firebase, которая извлекает список книг из API NYTimes и получает дополнительную информацию из API Google Книг. Используя следующий URL: " https://www.googleapis.com/books/v1/volumes?q=isbn: & key =" Я могу получить информацию о книгах на основе номера ISBN.
Моя БЕСПЛАТНАЯ квота для API Google Книг составляет 1000 запросов в день и 100 запросов каждые 100 секунд на пользователя. Я отправляю только 15 запросов, и моя текущая квота ниже 200.
Мой ключ ограничен только для использования с API Google Книг, и его можно использовать из любого места (iOS, Интернет, Android и т. Д.)
После создания функции я тестирую все локально, и данные заполняются правильно, хотя после развертывания функции в firebase я получаю код состояния 403 при попытке доступа к API.
К сожалению, я не получаю более подробную информацию об ошибке. Это просто так:
{ Error: Request failed with status code 403
at createError (/user_code/node_modules/axios/lib/core/createError.js:16:15)
at settle (/user_code/node_modules/axios/lib/core/settle.js:18:12)
at IncomingMessage.handleStreamEnd (/user_code/node_modules/axios/lib/adapters/http.js:201:11)
at emitNone (events.js:91:20)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)
config:
{ adapter: [Function: httpAdapter],
transformRequest: { '0': [Function: transformRequest] },
transformResponse: { '0': [Function: transformResponse] },
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus],
headers:
{ Accept: 'application/json, text/plain, */*',
'User-Agent': 'axios/0.18.0' },
method: 'get',
url: 'https://www.googleapis.com/books/v1/volumes?q=isbn:0525520384&key=##########’,
data: undefined },
request:
ClientRequest {
domain: null,
_events:
{ socket: [Function],
abort: [Function],
aborted: [Function],
error: [Function],
timeout: [Function],
prefinish: [Function: requestOnPrefinish] },
_eventsCount: 6,
_maxListeners: undefined,
output: [],
outputEncodings: [],
outputCallbacks: [],
outputSize: 0,
writable: true,
_last: true,
upgrading: false,
chunkedEncoding: false,
shouldKeepAlive: false,
useChunkedEncodingByDefault: false,
sendDate: false,
_removedHeader: {},
_contentLength: 0,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
socket:
TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
_SNICallback: null,
servername: null,
npnProtocol: false,
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object],
_eventsCount: 10,
connecting: false,
_hadError: false,
_handle: null,
_parent: null,
_host: 'www.googleapis.com',
_readableState: [Object],
readable: false,
domain: null,
_maxListeners: undefined,
_writableState: [Object],
writable: false,
allowHalfOpen: false,
destroyed: true,
_bytesDispatched: 210,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: null,
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: [Circular],
read: [Function],
_consuming: true,
write: [Function: writeAfterFIN],
_idleNext: null,
_idlePrev: null,
_idleTimeout: -1 },
connection:
TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
_SNICallback: null,
servername: null,
npnProtocol: false,
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object],
_eventsCount: 10,
connecting: false,
_hadError: false,
_handle: null,
_parent: null,
_host: 'www.googleapis.com',
_readableState: [Object],
readable: false,
domain: null,
_maxListeners: undefined,
_writableState: [Object],
writable: false,
allowHalfOpen: false,
destroyed: true,
_bytesDispatched: 210,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: null,
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: [Circular],
read: [Function],
_consuming: true,
write: [Function: writeAfterFIN],
_idleNext: null,
_idlePrev: null,
_idleTimeout: -1 },
_header: 'GET /books/v1/volumes?q=isbn:0525520384&key=##### HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nUser-Agent: axios/0.18.0\r\nHost: www.googleapis.com\r\nConnection: close\r\n\r\n',
_headers:
{ accept: 'application/json, text/plain, */*',
'user-agent': 'axios/0.18.0',
host: 'www.googleapis.com' },
_headerNames: { accept: 'Accept', 'user-agent': 'User-Agent', host: 'Host' },
_onPendingData: null,
agent:
Agent {
domai
1 ответ
Добавив больше ограничений к ключу (только HTTP) и добавив заголовок реферера к моему запросу и, наконец, добавив код страны в конец запроса, моя первоначальная проблема исчезла.
Примечание. Referer должен соответствовать значению ограничения http на вашем ключе.
Конечный URL:
Я столкнулся с аналогичной проблемой. Мне удалось успешно использовать Books API, когда я запускал свои функции локально (т. Е.firebase serve
). Но когда я развернул функции и приложение на хостинге, у меня возникла загадочная403: Forbidden
ошибка.
Я пробовал несколько вещей, поэтому не уверен, что помогло, поэтому просто перечислю все:
- Обновленные функции firebase:
npm install --save firebase-functions@latest
- Вышел из использования
node-fetch
использоватьaxios
для вызова API - Добавить страну в URL:
https://www.googleapis.com/books/v1/volumes?country=US&q=insubject:${randomWord}&key=${functions.config().books.api.key}
- Восстановленный ключ API Google Книг
- Удалены все
Application restrictions
в облачной консоли google
Надеюсь, это поможет кому-то там, потому что я боролся с этим часами!
API Google Книг должны знать страну, чтобы показывать соответствующие книги. либо передайте его через параметр страны, либо вы можете использовать клиент для прямого вызова API.