Làm cách nào để đăng nhập vào Google Cloud Storage từ một hàm python?

Aug 24 2020

Tôi mới sử dụng lưu trữ đám mây của google và tôi cố gắng thiết lập một chức năng tải xuống một blob mỗi ngày một lần. Hiện tại tôi đang làm việc trong Máy tính xách tay Jupyter của mình nhưng cuối cùng, mã sẽ chạy trong Hàm Azure. Tôi đang đấu tranh với việc thiết lập ứng dụng khách kết nối tôi với nhóm. Tôi có thông tin xác thực tài khoản dịch vụ JSON cho phép tôi kết nối với google.

Tại địa phương, tôi đã tìm thấy một giải pháp:

from google.cloud import storage

client = storage.Client.from_service_account_json('<PATH_TO_SERVICE_ACCOUNT_JSON>')

Vấn đề là tôi không có đường dẫn nơi tôi lưu trữ JSON của mình trên đám mây nhưng tôi lưu trữ nó trong kho chìa khóa. Tôi đã đưa ra giải pháp sau:

from google.cloud import storage
import json
from google.oauth2 import service_account

string_key = get_key_from_key_vault()
service_account_info = json.loads(string_key)
google_credentials = service_account.Credentials.from_service_account_info(
    service_account_info
)
scoped_credentials = google_credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform.read-only'])
print(type(scoped_credentials))
client = storage.Client(credentials = scoped_credentials)

Tôi không hoàn toàn chắc chắn liệu mình có cần scoped_credentials = ...phần này hay không nhưng tôi chỉ có quyền đọc trên thùng. (nếu tôi bỏ qua phần, lỗi vẫn giữ nguyên)

Khi tôi sử dụng giải pháp này, tôi gặp lỗi sau:

DefaultCredentialsError: Could not automatically determine credentials. Please set 
GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For
 more information, please see https://cloud.google.com/docs/authentication/getting-started

Tôi không biết mình đang làm gì sai vì tôi nghĩ rằng tôi đã đặt thông tin xác thực rõ ràng.

P tốt nhất

Trả lời

1 JanHernandez Aug 24 2020 at 20:44

bạn có thể đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALSbằng đường dẫn của tệp json và xác thực hàm của bạn bằng cách khởi động ứng dụng khách lưu trữ mà không có tham số.

client = storage.Client()

* theo mặc định, máy khách lưu trữ sử dụng đường dẫn tệp trên biến môi trườngGOOGLE_APPLICATION_CREDENTIALS

Đây là cách dễ nhất để sử dụng thông tin đăng nhập JSON và nó tương thích với hầu hết các thư viện python của Google Cloud.

1 Pet Aug 25 2020 at 08:41

sau một số thử nghiệm khác, tôi phát hiện ra rằng tôi đã bỏ qua để thêm project = None. Nếu bạn thêm nó, hãy sử dụng lệnh sau để tạo ứng dụng khách mà nó hoạt động:

client = storage.Client(project = None, credentials = scoped_credentials)

Cảm ơn sự giúp đỡ của bạn và đồ ăn cho sự suy nghĩ :-)

guillaumeblaquiere Aug 24 2020 at 19:19

(Tôi sử dụng phần câu trả lời vì định dạng mã trong nhận xét là khủng khiếp)

Bạn có thể thử điều này và cho tôi biết nếu bạn thấy 2 mã thông báo truy cập được in?

from google.cloud import storage
import json
from google.oauth2 import service_account
from google.auth.transport import requests as grequests

string_key = get_key_from_key_vault()
service_account_info = json.loads(string_key)

google_credentials = service_account.Credentials.from_service_account_info(
    service_account_info
)
google_credentials.refresh(grequests.Request())
print(google_credentials.token)


scoped_credentials = google_credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform.read-only'])
scoped_credentials.refresh(grequests.Request())
print(scoped_credentials.token)