Shopify Session 설치

2024년 5월 8일 수요일

Today I Learned

날짜

2024년 5월 8일 수요일

내용

Shopify session

새로 추가될 앱을 같은 서버에 만들었다. 앱이 설치되는 방식은 대략 다음과 같다. 쇼피파이에 설정해둔 우리 서버의 엔드포인트로 요청이 들어오면(/shopify) 우리 서버는 shopify_session을 이용해 허용 URL을 만들고 redirect시킨다. 앱을 설치하는 고객은 앱이 요청하는 권한(고객 데이터 접근, 주문 데이터 접근 등등)에 대해 확인하고 허가하는 창으로 안내되고, 허용하면 다시 우리 서버로 요청이 넘어온다. 이후로 온보딩 플로우로 넘어가든, 로그인으로 넘어가든 우리 코드대로 처리된다.

이 “쇼피파이 세션”을 설정할 때 우리 앱만이 고유하게 가지는 API_KEY와 SECRET_KEY를 이용한다. 새로 앱을 만들었기 떄문에, 그 앱도 자체적인 값들이 존재한다. 또한 설치할 때 요청이 처리되는 엔드포린트(/shopify 등)들은 미리 앱 설정에서 redirect_url로 등록해놔야 한다.

  1. 세션을 만들어 설치요청을 처리할 때 API_KEY나 SECRET_KEY가 잘못되거나,
  2. redirect_url이 제대로 등록되지 않으면

설치 과정에서 오류가 발생한다.

테스트 서버에 새로운 앱을 설치하는 엔드포인트롤 새로 추가했다. 새로운 앱 설치에는 이상이 없었는데, 갑작스레 기존에 잘 되던 알파플러스 테스트앱 설치가 오류가 발생하기 시작했다.

오류 메시지 자체가 hmac에 관해서 뜨고 있길래 이 부분이 잘못되었다고 생각해서 이것 저것 찾아보며 고쳐봤지만 큰 소득은 없었다. 나와 비슷한 문제를 겪는 사람들은 SECRET_KEY가 잘못되었거나, redirect_url을 등록할때 끝에 /shopify/ 처럼 “/”를 붙여서 생긴 오류였지만, 난 아니였다..

곰곰히 코드를 들여다 보다가 쇼피파이 세션을 생성하는 부분에 의문이 생겼다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
shopify.Session.setup(api_key=SHOPIFY_API_KEY, secret=SHOPIFY_API_SECRET)

@router.get("/shopify/callback")
async def shopify_redirect(
    request: Request,
    ...,
    db: Session = Depends(get_db),
):
    params = {
        "code": code,
        ...,
        "hmac": hmac,
    }
    session = shopify.Session(shop, API_VERSION)
    try:
        access_token = session.request_token(params)
        ...

이런 식으로 되어있었다. 별도의 함수가 호출되지 않아도 Session은 설치되고 있었다. 문제는, 1개의 서버에서 2개의 앱을 처리하고 있다. 따라서 위와 같은 코드가 2곳에 있다는 뜻이고, 서버의 세션은 어떤 앱을 변수로 받아 처리하는지 알 수가 없다. 아마 브라우저 부스터 앱은 설치되고 알파플러스 테스트 앱은 설치가 되고 있지 않은걸로 보아 새로운 앱을 위한 세션 설치가 더 나중에 처리되고 덮어씌워졌다고 판단했다. 세션이 설치되는 시점을 함수가 실행될 때로 변경하고, 매번 세션을 클리어주는 함수를 추가하여해결했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@router.get("/shopify/callback")
async def shopify_redirect(
    request: Request,
    ...,
    db: Session = Depends(get_db),
):
    params = {
        "code": code,
        ...,
        "hmac": hmac,
    }
    # 세션 초기화
    shopify.ShopifyResource.clear_session()
    # 세션 설정
    shopify.Session.setup(api_key=SHOPIFY_API_KEY, secret=SHOPIFY_API_SECRET)
    session = shopify.Session(shop, API_VERSION)
    try:
        access_token = session.request_token(params)
        ...

회고

제발 작동 좀 해줘…