본문 바로가기
GIS/GEE(Google Earth Engine)

[GEE] GEE, GEEMap Authenticate 자동 갱신하는 방법.

by Mujae98 2024. 1. 4.

이건 진짜 원래 API 잘 다루는 사람 아니면 알기 힘들다.

우선 Github으로 Streamlit 배포할 때와 도커를 이용해서 배포할 때가 다른데 오늘은 Docker를 사용했을 때를 설명하겠다.

 

원래 ipynb에서 GEE, Geemap을 사용하려면 ee.aunthenticate()나 geemap.ee_initialize() 및 authenticate()를 실행해야 한다.

그리고 인증을 하면 토큰을 받을 수 있는데 그것을 입력해주면 된다.

그런데 스트림릿 같은 경우에 웹을 구동하는 순간에 Authenticate가 되어 있지 않으면 아래와 같은 에러가 발생한다.

EOFError: EOF when reading a line
Traceback:
File "/usr/local/lib/python3.9/dist-packages/streamlit/runtime/scriptrunner/script_runner.py", line 534, in _run_script
    exec(code, module.__dict__)
File "/app/streamlit/main.py", line 77, in <module>
    launch()
File "/app/streamlit/main.py", line 14, in launch
    geemap.ee_initialize()
File "/usr/local/lib/python3.9/dist-packages/geemap/common.py", line 130, in ee_initialize
    ee.Authenticate(**auth_args)
File "/usr/local/lib/python3.9/dist-packages/ee/__init__.py", line 105, in Authenticate
    oauth.authenticate(
File "/usr/local/lib/python3.9/dist-packages/ee/oauth.py", line 430, in authenticate
    flow.save_code()
File "/usr/local/lib/python3.9/dist-packages/ee/oauth.py", line 479, in save_code
    _obtain_and_write_token(code, self.code_verifier, self.scopes, redirect_uri)
File "/usr/local/lib/python3.9/dist-packages/ee/oauth.py", line 188, in _obtain_and_write_token
    auth_code = input('Enter verification code: ')

 

이럴 때 방법이 있다. 

구글의 OAuth를 이용하면 된다.(이미 내글을 볼 정도면 이것저것 많이 해봤을걸 알기에 간단한 설명만 적겠다.)

OAuth에서 API key를 json 형식으로 아래와 같이 만든다.

{
  "type": "service_account",
  "project_id": "",
  "private_key_id": "",
  "private_key": "-----BEGIN PRIVATE KEY-----\",
  "client_email": "",
  "client_id": "",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/"
  "universe_domain": "googleapis.com"
}

 

그러고 main.py(메인페이지)의 lunch() 부분에 다음과 같은 코드를 추가한다.

service_account_json = 'json 경로'
    credentials = service_account.Credentials.from_service_account_file(
        service_account_json,
        scopes=['https://www.googleapis.com/auth/cloud-platform']
    )

    # Earth Engine 초기화
    ee.Initialize(credentials)

 

이런식으로 Initialize 안에 credential을 넣어주는 것이 포인트다.

시작할 때 말했던 것처럼 GEE 시작할 때 인증하고, 토큰 가져온걸 입력하는 것이 포인트인데 그걸 자동으로 해준다고 생각하면 된다.