목차
개요
과거 Google Oauth 로그인을 Python으로 테스트하기에 앞서 다음과 같은 라이브러리가 필요했었다.
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
이번엔 KaKao Oauth Login(이하 KaKao Login)을 Python으로 테스트해 봤는데. 테스트하는 과정에서 KaKao Login을 위한 Python 라이브러리를 따로 찾을 수 없었다.
머리를 굴려보다 Python에서 KaKao Login을 테스트해보기 위한 방법으로 requests_oauthlib을 이용해 KaKao Login을 테스트에 성공할 수 있었고 이 글은 그 과정을 기록한 글이다.
1. Python Library
“개요”에서 언급했듯이 KaKao Login을 Python으로 테스트해보기 위해 필자가 사용한 라이브러리는 request_oauthlib이다.
pip install requests-oauthlib
Oauth Login은 중간에 Redirection 과정이 있기 때문에 callback server를 필요로 하고 이 때문에 Flask와 같은 경량 프레임워크를 통해 구현한다. 그러나 Flask를 굳이 사용하지 않아도 callback server를 사용할 수 있는데 python에 bulit-in으로 제공되는 HttpServer가 그것이다.
python3에서는 다음과 같은 명령으로 간단한 http server를 띄울 수 있고 이를 callback server로 활용할 것이다.
python3 -m http.server 8080
2. KaKao Oauth Login을 위한 준비
Oauth 로그인 과정에서 필요한 값들은 “client_id”, “client_secret”, “redirect_url”이다. KaKao developers에서 “app”을 생성했다면 각각의 값을 확인해 보자.
2.1 client_id 확인하기
“client_id”의 경우 “내 애플리케이션 > 앱 설정 > 요약 정보”에서 확인할 수 있다.
2.2 client secret 확인하기
client_secret”은 “내 애플리케이션 > 제품 설정 > 카카오 로그인 > 보안” 에서 확인할 수 있다.
2.3 Redirect URL 확인하기
Redirect URL은 “내 애플리케이션 > 제품 설정 > 카카오 로그인” 화면에서 확인할 수 있다.
3. KaKao Oauth API URI
KaKao Oauth Login을 테스트하기 위해 두 개의 API 주소는 알고 있어야 한다. 하나는 Authorizaion Code를 얻기 위한 API 주소와 다른 하나는 Authorization Code를 통해 Access Token을 얻기 위한 API 주소이다.
3.1 Authorization Code API
https://kauth.kakao.com/oauth/authorize
3.2 Acces Token API
https://kauth.kakao.com/oauth/token
4. KaKao OAuth Login
4.1 Variable 설정
KaKao Oauth Login을 위해 앞서 기술한 정보를 변수로 나타내면 다음과 같다.
authorize_url = "https://kauth.kakao.com/oauth/authorize"
token_url = "https://kauth.kakao.com/oauth/token"
client_id = ""
client_secret = ""
redirect_url = ""
4.2. Authorization Code 얻기
이제 request_oauthlib을 이용해 KaKao Oauth Login을 진행해 보자. 먼저 Authorization Code를 얻도록 하자.
from requests_oauthlib import OAuth2Session
oauth_session = OAuth2Session(client_id=client_id, redirect_uri=redirect_url)
url, state = oauth_session.authorization_url(authorize_url)
print(url, state)
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있다.
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=&redirect_uri=http%3A%2F%2Flocalhost%3A8080&state=no50aIOjyIJTDzb8lc06HjGhdxcMmO> no50aIOjyIJTDzb8lc06HjGhdxcMmO
url과 state 값을 얻을 수 있다. 이때 python Http Server가 가동 중이면 다음과 같이 Authorization Code를 얻을 수 있게 된다.
$ python3 http.server 8080
::1 - - [04/Mar/2024 21:44:12] "GET /?code=u...g&state=SnIcItkEGMgqlVqhIV0N4yeUBwIWKr HTTP/1.1" 200 -
Query String의 Code 부분이 Authorization Code이다.
4.3 Access Token 얻기
이제 access token을 얻기 위해 oauthlib에서 제공하는 fetch_token() 메서드를 이용하도록 하자.
result = oauth_session.fetch_token(
token_url=token_url,
client_id=client_id,
client_secret=client_secret,
include_client_id=True,
code=authorization_code
)
성공한 경우 access_token을 확인할 수 있는 json을 응답받는다.
마치며
fetch_token() 메서드를 이용해 access_token을 얻는 과정에서 include_client_id를 True로 설정하지 않은 채 테스트를 시도했는데 계속 client_secret을 찾을 수 없다는 응답을 받았는데 이 부분을 주의하도록 하자.
'Language > Python' 카테고리의 다른 글
[SQLAlchemy] Imperative Mapping, exclude properties (0) | 2024.03.07 |
---|---|
[SQLAlchemy] Imperative Mapping, Column 합성 (1) | 2024.03.06 |
[SQLALchemy] Imperative Mapping, Eager/Lazy Loading (0) | 2024.02.25 |
[TroubleShoot] no such file libmysqlclient.21.dylib (0) | 2024.02.04 |
dependency-Injector로 Repository Pattern 사용하기 (0) | 2023.11.24 |