서비스 계정 자격 증명을 다운로드하지 않고 Google Compute Engine에서 로컬로 Google API (Google Drive API)를 인증하는 방법은 무엇입니까?
우리 회사는 Google Cloud Platform의 Google Sheets (Google Drive 내)에서 데이터를 처리하는 작업을 진행 중이며 인증에 몇 가지 문제가 있습니다.
Google 드라이브에 대한 API 호출을 수행하는 코드를 실행해야하는 두 가지 위치가 있습니다. Google Compute Engine의 프로덕션 환경과 개발 환경 (예 : 개발자의 랩톱에서 로컬)입니다.
우리 회사는 자격 증명에 대해 매우 엄격하며 서비스 계정 자격 증명 JSON 키의 다운로드를 허용하지 않습니다 (더 나은 방법이며 더 높은 보안을 제공함). GCP의 모든 문서는 단순히 서비스 계정에 대한 JSON 키를 다운로드하고 사용하도록 말합니다. 또는 Google API / 개발자 문서에서 OAuth2 클라이언트 ID를 만들고 여기 와 같이 키를 다운로드하라고 말합니다 .
그들은 종종 다음과 같은 코드를 사용합니다.
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
하지만 서비스 계정 JSON 키를 다운로드 할 수 없거나 다운로드 할 수 없기 때문에 문서를 따르기 만하면 멈 춥니 다.
Google Compute Engine 환경의 경우 GCP 애플리케이션 기본 사용자 인증 정보 (ADC)를 사용하여 인증 할 수있었습니다. 즉, 코드에서 사용할 사용자 인증 정보를 명시 적으로 지정하지 않고 클라이언트 라이브러리가 '그냥 작동'하도록 허용하지 않았습니다. VM이 올바른 범위로 생성되고 https://www.googleapis.com/auth/drive
기본 컴퓨팅 서비스 계정 이메일에 액세스해야하는 시트에 대한 권한이 부여 됩니다 . 자세한 내용 은 여기 문서에 설명되어 있습니다 . 이렇게 할 수 있습니다.
from googleapiclient.discovery import build
service = build('sheets', 'v4')
SPREADSHEET_ID="<sheet_id>"
RANGE_NAME="A1:A2"
s = service.spreadsheets().values().get(
spreadsheetId=SPREADSHEET_ID,
range=RANGE_NAME, majorDimension="COLUMNS"
).execute()
그러나 개발을 위해이를 어떻게 수행합니까? 즉, 개발자의 랩톱에서 로컬로 수행 할 수 있습니까? 다시 말하지만, JSON 키를 다운로드하지 않고 가능한 한 가장 "작동하는"접근 방식을 사용하는 것이 좋습니다.
일반적으로 gcloud auth application-default login
Google 클라이언트 라이브러리에서 사용하는 기본 애플리케이션 사용자 인증 정보를 만드는 데 사용 합니다. 그러나 service = build('sheets', 'v4')
'요청에 인증 범위가 충분하지 않습니다.'라는 오류와 함께 실패하는 Google Drive API와 같이 GCP 외부의 Google API에는 작동하지 않습니다 . 그런 다음 다음과 같은 모든 종류의 솔루션을 시도했습니다.
credentials, project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/drive"])
과
credentials, project_id = google.auth.default()
credentials = google_auth_oauthlib.get_user_credentials(
["https://www.googleapis.com/auth/drive"], credentials._client_id, credentials._client_secret)
)
기타 ... Google Drive API에 대한 인증을 시도 할 때 지나칠 수없는 수많은 오류 / 문제가 있습니다.
이견있는 사람?
답변
개발 환경에서 쉽게 인증하는 한 가지 방법은 서비스 계정 가장 을 사용 하는 것 입니다.
다음 은이 작업의 이점을 포함하여 서비스 계정 가장 사용에 대한 블로그입니다. @johnhanley (블로그 게시물을 작성한 사람)는 훌륭한 사람이며 매우 유익한 답변도 많이 있습니다!
로컬 머신이 Google Drive API에 대해 인증되도록하려면 서비스 계정을 가장하는 로컬 머신에서 기본 애플리케이션 사용자 인증 정보를 만들고 액세스하려는 API에 필요한 범위를 적용해야합니다.
서비스 계정을 가장 할 수 있으려면 사용자에게 역할이 있어야합니다 roles/iam.serviceAccountTokenCreator
. 이 역할은 전체 프로젝트 또는 개별 서비스 계정에 적용 할 수 있습니다.
를 사용하여 다음 gcloud을 수행 할 수 있습니다 .
gcloud iam service-accounts add-iam-policy-binding [COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL] \
--member user:[USER_EMAIL] \
--role roles/iam.serviceAccountTokenCreator
이 작업이 완료되면 로컬 자격 증명을 만듭니다.
gcloud auth application-default login \
--scopes=https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/accounts.reauth \
--impersonate-service-account=[COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL]
이것은 당신이 얻은 범위 오류를 해결할 것입니다. Drive API 범위를 넘어 추가 된 세 가지 추가 범위는 gcloud auth application-default login
적용되고 필요한 기본 범위입니다 .
가장없이 범위를 적용하면 인증을 시도 할 때 다음과 같은 오류가 발생합니다.
HttpError: <HttpError 403 when requesting https://sheets.googleapis.com/v4/spreadsheets?fields=spreadsheetId&alt=json returned "Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the sheets.googleapis.com. We recommend configuring the billing/quota_project setting in gcloud or using a service account through the auth/impersonate_service_account setting. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.">
자격 증명을 설정하면 로컬 머신의 Google Compute Engine에서 실행되는 것과 동일한 코드를 사용할 수 있습니다. :)
참고 : 모든 gcloud 명령어에 가장을 설정할 수도 있습니다.
gcloud config set auth/impersonate_service_account [COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL]
서비스 계정을 가장하여 로컬 머신에 기본 애플리케이션 크리 덴 테일을 만드는 것은 개발 코드를 인증하는 매끄러운 방법입니다. 이는 코드가 가장하는 서비스 계정과 정확히 동일한 권한을 가짐을 의미합니다. 이것이 프로덕션에서 코드를 실행할 동일한 서비스 계정이면 개발중인 코드가 프로덕션과 동일하게 실행된다는 것을 알 수 있습니다. 또한 서비스 계정 키를 생성하거나 다운로드 할 필요가 없음을 의미합니다.