본문으로 바로가기

[GCP] Python으로 Google Oauth Login 하기

category Language/Python 2023. 11. 22. 16:56
728x90
반응형

목차

     

     

    2023.09.26 - [개발 노트/Python] - [GCP] GCP Project 설정하기

     

    개요 

    Google Oauth Login 기능은 잊을만하면 구현할 일이 생기는 듯하다. 이번 글에서는 Python으로 Google Oauth Login을 만드는 간략한 방법을 기록하고자 한다.

     

     

    1.  Library Setting

    Python으로 Google Oauth2 Login을 하기 전에 필요한 라이브러리는 다음과 같다. pip를 이용해 다운로드하자.

    google-api-core==2.14.0
    google-api-python-client==2.108.0
    google-auth==2.23.4
    google-auth-httplib2==0.1.1
    google-auth-oauthlib==1.1.0

     

    2.  client_config와 scope

    google library를 사용하기 전에 필요한 설정이다.

    client_config = {
        "installed": {
            "client_id":YOUR_CLIENT_ID,
            "client_secret": YOUR_CLIENT_SECRET,
            "redirect_uri": 'urn:ietf:wg:oauth:2.0:oob',
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token",
            "grant_type": "authorization_code"
        }
    }

     

    다른 예제에서는 GCP에서 발급해 주는. json 파일을 사용하지만 여기서는 단순히 client_id와 client_secret 정보를 가지고 python의 dictionary를 이용해 볼 것이다. 그리고 Google API의 범위 (scope)를 설정해 주자.

    SCOPES = ['openid',
              'https://www.googleapis.com/auth/userinfo.email',
              'https://www.googleapis.com/auth/userinfo.profile']

    
    Oauth2를 통해 사용자의 profile과 email에 관련된 정보에만 접근할 수 있게 하는 부분이다.

     

     

    3.  Google Oauth 인증 브라우저 열기

    위와 같이 설정을 마치면 다음과 같은 코드를 통해 Google Oauth Login을 시도할 수 있는 브라우저의 주소를 얻을 수 있게 된다.

    from google_auth_oauthlib.flow import InstalledAppFlow
    
    flow = InstalledAppFlow.from_client_config(client_config, scopes=SCOPES)
    flow.redirect_uri = "http://localhost:3000/api/auth/callback/google"
    
    auth_url, _ = flow.authorization_url(prompt='consent')
    
    print(f'다음 URL에 접속하여 사용자 동의를 얻으세요: {auth_url}')

     

    주의할 점은 redirect_uri는 gcp에 등록된 redriect_uri라는 점이다.

     

     

    4.  Authorization Code 획득하기

    이제 코드를 실행하면 다음과 같은 링크가 나온다.

     

    이 링크를 클릭하면 브라우저가 띄워지며 이제 Google Oauth 로그인이 가능한 계정을 볼 수 있다.

    로그인 하고 싶은 계정을 클릭하면 다음과 같이 Browser의 URL 창에 Authorization Code가 나온다.

     

     

    5. Authorization Code를 이용해 id-token(jwt token) 얻기

    위에서 얻은 Authorization Code를 검증해 보자. 주의할 점은 4번 단계에서 얻은 Authorization Code를 그대로 넣으면 안 되며 "URL DECODING"을 한번 거친 뒤 나온 값을 이용해야 한다.

    flow.fetch_token(code=auth_code)
    
    credentials = flow.credentials
    
    print(credentials.id_token)

     

    다음과 같이 id-token을 얻게 된다.

     

    이 id-token에는 다음과 같은 정보가 포함되어 있다.

    {
      "iss": "https://accounts.google.com",
      "azp": "",
      "aud": ",
      "sub": "",
      "email": "",
      "email_verified": true,
      "at_hash": "",
      "name": "",
      "picture": "",
      "given_name": "",
      "family_name": "",
      "locale": "",
      "iat": 1700639281,
      "exp": 1700642881
    }

     

    6.  id-token(jwt token) 검증하기

    앞에서 얻은 id-token을 검증하는 함수는 다음과 같다.

    from google.oauth2.id_token import verify_oauth2_token

    사용형태는 다음과 같다.

    from google.oauth2.id_token import verify_oauth2_token
    from google.auth.transport.requests import Request
    
    google_credential = verify_oauth2_token(
        id_token,
        Request(),
        constant.GOOGLE_CLIENT_ID
    )

     

    검증에 실패한 경우 다음과 같은 Exception이 일어난다.

    google.auth.exceptions.MalformedError



     

    Reference

    https://developers.google.com/identity/sign-in/web/backend-auth?hl=ko 

    728x90
    반응형