У меня проблемы с отправкой данных с моей виртуальной машины Linux в Firestore моего GCP.Я просто пытаюсь обновить элемент внутри базы данных.У меня проблема с учетными данными.В зависимости от метода, который я использую, я получаю разные ошибки, но я считаю, что все они связаны с одной и той же проблемой.
Как примечание, у меня есть служебная учетная запись с учетными данными json.Я знаю, что эти учетные данные все еще действительны, потому что я могу использовать GCP's Speech-to-Text.Единственное странное поведение, которое я получаю, это доступ к Firestore.
Примечание. Я использую Firestore с консоли GCP, а не с консоли Firebase.Я вижу, что существуют небольшие различия в том, как они используются (главным образом, в сфере безопасности).
Если я просто открываю новый терминал и запускаю свой скрипт на python (я не устанавливаю никаких ссылок на мой файл учетных данных).Данные успешно добавлены в базу данных, но я получаю следующее предупреждение:
UserWarning: Your application has authenticated using end user credentials from Google Cloud
SDK. We recommend that most server applications use service accounts instead. If your
application continues to use end user credentials from Cloud SDK, you might receive a "quota
exceeded" or "API not enabled" error. For more information about service accounts, see
https://cloud.google.com/docs/authentication/
С другой стороны, если я запускаю строку export GOOGLE_APPLICATION_CREDENTIALS="folder/file.json"
перед запуском того же скрипта Python.Вместо этого я получу эту ошибку:
Traceback (most recent call last):
File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 57, in error_remapped_callable
return callable_(*args, **kwargs)
File "/home/vagrant/.local/lib/python3.6/site-packages/grpc/_channel.py", line 565, in __call__
return _end_unary_response_blocking(state, call, False, None)
File "/home/vagrant/.local/lib/python3.6/site-packages/grpc/_channel.py", line 467, in _end_unary_response_blocking
raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.PERMISSION_DENIED
details = "Missing or insufficient permissions."
debug_error_string = "{"created":"@653.64","description":"Error received
from peer ipv4:...:","file":"src/core/lib/surface
/call.cc","file_line":1052,"grpc_message":"Missing or insufficient
permissions.","grpc_status":7}"
>
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "sendToDB.py", line 28, in <module>
update_create_if_missing(args.uid, args.words)
File "sendToDB.py", line 16, in update_create_if_missing
item.update({'text': firestore.ArrayUnion([words])})
File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/document.py", line 382, in update
write_results = batch.commit()
File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/batch.py", line 147, in commit
metadata=self._client._rpc_metadata,
File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/gapic/firestore_client.py", line 1042, in commit
request, retry=retry, timeout=timeout, metadata=metadata
File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/gapic_v1/method.py", line 143, in __call__
return wrapped_func(*args, **kwargs)
File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/retry.py", line 273, in retry_wrapped_func
on_error=on_error,
File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/retry.py", line 182, in retry_target
return target()
File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/timeout.py", line 214, in func_with_timeout
return func(*args, **kwargs)
File "/home/vagrant/.local/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 59, in error_remapped_callable
six.raise_from(exceptions.from_grpc_error(exc), exc)
File "<string>", line 3, in raise_from
google.api_core.exceptions.PermissionDenied: 403 Missing or insufficient permissions.
Если я укажу файл учетных данных непосредственно в файле python, используя строку, подобную этой db = firestore.Client(project="myproj-99999",credentials="folder/file.json")
, я получу эту ошибку:
Traceback (most recent call last):
File "sendToDB.py", line 23, in <module>
update_create_if_missing(args.uid, args.words)
File "sendToDB.py", line 9, in update_create_if_missing
db = firestore.Client(project="earningstotext-251320",credentials="keys/gcpcmdlineuser.json")
File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/firestore_v1/client.py", line 105, in __init__
project=project, credentials=credentials, _http=None
File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/client.py", line 227, in __init__
Client.__init__(self, credentials=credentials, _http=_http)
File "/home/vagrant/.local/lib/python3.6/site-packages/google/cloud/client.py", line 130, in __init__
raise ValueError(_GOOGLE_AUTH_CREDENTIALS_HELP)
ValueError: This library only supports credentials from google-auth-library-python.
See https://google-cloud-python.readthedocs.io/en/latest/core/auth.html
for help on authentication with this library.
Обратите внимание, что ссылка readthedocs здесь не работает.
По сути, я просто хотел бы иметь возможность обновлять и читать из моего Firestore, используя python, без каких-либо ошибок или предупреждений.Я также не могу понять, почему, один раз, когда это работает (когда я получаю предупреждение), это когда я не устанавливаю какие-либо учетные данные.
Этот вопрос похож на my предыдущий найденный вопрос здесь .Однако я думаю, что моя новая информация заслуживает отдельного вопроса.