본문 바로가기

Programming/코딩 짤팁

파이썬 로그인 세션 유지하기 & 티스토리 API Access token 자동 발급

※ API Access Token 발급 방식이 변경되어 아래 게시글에 새로 작성하였습니다.

 

티스토리 API Access token 자동 발급 받기 업데이트

| 발급 프로세스 변경 Implicit 방식에서 Authentication Code 방식으로 얼마전 예전에 작성했던 "파이썬 로그인 세션 유지하기 & 티스토리 API Access token 자동 발급" 의 Access token 을 얻어오는 코드가 동작.

garnetiger.com

Session 유지의 필요성

오픈API의 Oauth 2.0 인증이나 기타 다른 프로그램을 만들다 보면 세션을 유지해야 하는 경우가 있다. 로그인 상태를 유지한다고 생각하면 이해가 쉽다. 특히 Oauth 인증은 API사용을 위한 ID, Key 값을 이용해서 다른 Token을 받아와야 하는 경우가 있기 때문에 세션유지를 해줘야 한다. 예전에는 그냥 로그인하고 Cookie 값을 가져다 코드에 박아 넣었지만 인증세션이 만료되면 Cookie 를 다시 확인해서 넣어줘야 되는 번거로움이 있다. 티스토리 API로 Oauth 인증방식을 사용하고 있어 세션 유지가 필요하다.

Session 유지 구현

먼저 requests 를 import 해준다. 파이썬 라이브러리에 requests가 없다면 pip -install requests 로 설치해 준다. 티스토리 API 사용을 위한 app_id와 secret_key도 선언해 준다. access_token을 파싱하기 위해 정규식 라이브러리도 추가해 준다.

import requests
import re

app_id = 'YOUR_APP_ID'
secret_key = 'YOUR_SECRET_KEY'

다음은 로그인 세션과 access_token 을 얻어오는데 필요한 URL / 파라메터들을 미리 설정해 준다.

auth_url = 'https://www.tistory.com/oauth/authorize'
params = {'client_id' : app_id, 'redirect_uri' : 'YOUR_API_ADDRESS', 'response_type' : 'token'}

login_url = 'https://www.tistory.com/auth/login'
login_info = {'redirectUrl' : 'https://www.tistory.com', 'loginId' : 'YOUR_LOGIN_ID', 'password' : 'YOUR_LOGIN_PASSWORD'}

세션을 생성하기 위해서는 requests.Session() 을 사용해주면 된다. 그리고 세션을 유지하며 사용하기 위해 with 문을 사용해 주고 로그인을 시도해준다.

with requests.Session() as s:
	res = s.post(login_url, data=login_info)

로그인이 성공하면 access_token을 얻어오는 구문을 만들어 준다. 브라우저 개발자 도구로 확인했을 때  access_token은 response header의 location에 포함되어 리턴되므로 Redirects는 False로 설정해 주어야 다른 페이지로 이동하지 않고 제대로 된 Response Header를 얻을 수 있다. User-Agent 부분때문에 고생을 좀 했는데 티스토리 API는 웹브라우저로 접속하는 User-Agent 일떄만 로그인 세션을 성립해 주는 것 같다. 파이썬으로 하면 이부분이 Python 관련 User-Agent로 변경되어 세션이 제대로 만들어 지질 않으므로 Mozilla/5.0으로 변경해 준다. IE든 Chrome 이든 Safari 등 웹 브라우저에서 사용하는 User-Agent라면 원하는 대로 바꾸어도 상관없다.

if(res.status_code == 200):
	headers = {'User-Agent' : 'Mozilla/5.0'}
	auth_res = s.get(auth_url, params=params, headers=headers, allow_redirects=False)
	redirect_location = auth_res.headers['location']
	print(redirect_location)

마지막으로 정규식을 써서 access_token 부분만 파싱해 준다.

match = re.match('(.*?)access_token=(?P<access_token>.*?)&state=', redirect_location)
access_token = match.groupdict()['access_token']

위에 설명한 부분들을 Get_Access_Token 함수로 선언하여 호출해 사용할 수 있도록 해준다. 전체 코드는 아래와 같다.

import requests
import re

app_id = 'YOUR_APP_ID'
secret_key = 'YOUR_SECRET_KEY'

auth_url = 'https://www.tistory.com/oauth/authorize'
params = {'client_id' : app_id, 'redirect_uri' : 'YOUR_API_ADDRESS', 'response_type' : 'token'}

login_url = 'https://www.tistory.com/auth/login'
login_info = {'redirectUrl' : 'https://www.tistory.com', 'loginId' : 'YOUR_LOGIN_ID', 'password' : 'YOUR_LOGIN_PASSWORD'}

def Get_Access_Token():
    with requests.Session() as s:
        res = s.post(login_url, data=login_info)

        if(res.status_code == 200):
            headers = {'User-Agent' : 'Mozilla/5.0'}
            auth_res = s.get(auth_url, params=params, headers=headers, allow_redirects=False)
            redirect_location = auth_res.headers['location']
            print(redirect_location)

            match = re.match('(.*?)access_token=(?P<access_token>.*?)&state=', redirect_location)
            access_token = match.groupdict()['access_token']
            return access_token

access_token = Get_Access_Token()
print(access_token)

참고문서

 

Implicit 방식 · GitBook

No results matching ""

tistory.github.io

 

  • 방가워요 2020.09.08 11:56

    비밀 댓글이라 달아 주신 내용이 안보여 다시 남깁니다.

    안녕하세요
    포스팅 내용 감사합니다.

    위 예제로 실행해보면 로그인 할 때
    브라우저 보안을 위한 정보를 가져 올 수 없습니다.
    라는 메세지와 함께 로그인이 안됩니다.

    티스토리 내에서 따로 설정해줘야 하는 부분이 있는건가요?

  • 방가워요 2020.09.08 12:46

    답변 감사합니다.
    API신청은 해두었습니다.

    res = s.post(login_url, data=login_info)
    실행 결과를 확인해보면 status_code는 200으로 정상이지만
    처리 결과를 보면
    브라우저 보안을 위한 정보를 가져 올 수 없습니다.
    라고 반환이 됩니다.

    이러한 문제가 없으셨는지 궁금했는데...
    티스토리 설정 문제인거 같네요.
    감사합니다.

  • 방가워요 2020.09.08 14:18

    알렉스님

    궁금한게 하나더 있어 질문 남깁니다.
    로그인 부분은 해결을 했습니다.

    토큰을 취득해 오는 부분에서 status_code결과가 302로 나옵니다.
    작성해 주신 로직을 변경하지 않았는데 혹시 알렉스님도 지금 토근 취득이 잘 되고 있으신지 궁금합니다~~

    • Oscar garnetiger 2020.09.08 14:43 신고

      302 리다이렉트는 인증 후 액세스 토큰을 받는 URI로 이동을 하기 떄문에 정상이라고 할 수 있습니다. 다만 아래 내용을 보니 인증후 Access Token을 취하는 방식에 일부 변화가 있는것으로 보입니다. https://tistory.github.io/document-tistory-apis/auth/authorization_code.html

    • Oscar garnetiger 2020.09.08 14:47 신고

      덧붙이자면 해당 포스팅 당시에는 리스폰스헤더에 Access token이 포함되어 리턴되었지만 현재는 리다이렉트 URI로 한번더 이동을 해야 토큰값에 접근이 가능할 것으로 보입니다.

    • 방가워요 2020.09.08 15:26

      답변 감사합니다.
      링크해주신 내용 확이해서 다시 시도해봐야 겠네요.
      감사합니다 ^^

    • Oscar garnetiger 2020.09.25 17:07 신고

      안녕하세요 문제는 해결 하셨나요? 오늘 시간이 남아서 수정된 부분을 확인하였습니다. 기존에 Implicit 방식이 Authentication Code 방식으로 변경되면서 단계가 하나 더 추가 됐습니다. 아래 포스팅에 수정된 코드를 포스팅 했으니 참고해 보시면 좋을 것 같습니다.
      https://nimda.tistory.com/721