우아이드 프로그램에서 사용자 인증 방법 (Django 백엔드 활용)

우아이드 프로그램에서 사용자를 식별하는 방법은 다음과 같습니다:

대부분의 웹 개발자들은 클라이언트가 요청을 보내면, 서버는 세션에 user_id를 저장하고 이를 통해 다음 요청에서 사용자를 식별할 수 있음을 알고 있습니다. 그러나 우아이드 프로그램에서는 유일한 식별자가 없으며, 닉네임이나 성별 등의 정보만 존재합니다. 이러한 정보가 사용자에 의해 변경될 경우 서버는 더 이상 사용자를 식별할 수 없습니다.

1단계: wx.login API 호출

우선 wx.login이라는 공식 API를 호출하여 사용자의 code를 얻습니다. 이 code는 서버로 전송됩니다.

2단계: 서버에서 openid와 session_key 획득

서버는 위에서 받은 code를 이용해 공식 인터페이스를 통해 사용자의 유일한 식별자인 openid와 session_key를 받습니다. 보안을 위해 서버는 직접 생성한 랜덤 문자열을 사용자에게 반환하며, 이를 통해 openid 대신 사용합니다(사용자 상태라고도 함).

3단계: 사용자 상태 저장

사용자는 반환받은 랜덤 문자열(사용자 상태)를 storage에 저장합니다. 우아이드 프로그램은 쿠키 기능을 제공하지 않으므로 이후 모든 요청에는 헤더에 저장된 사용자 상태를 포함시켜야 합니다.

4단계: 비즈니스 로직 처리

서버는 헤더로부터 사용자 상태를 받아 해당 사용자를 식별한 후 데이터를 반환하거나 비즈니스 로직을 수행합니다.

첫 방문 사용자 예제:

onLogin: function () {
  console.log('로그인 시도 중...');
  var that = this;
  wx.login({
    success(res) {
      if (res.code) {
        wx.request({
          url: 'http://127.0.0.1:8000/auth', // 서버로 code 전송
          data: {
            code: res.code,
            nickName: app.globalData.userInfo.nickName
          },
          success(response) {
            wx.setStorageSync('userToken', response.data.token); // 사용자 토큰 저장
          }
        });
      } else {
        console.error('로그인 실패:', res.errMsg);
      }
    }
  });
}

서버에서 openid 및 session_key 획득:

import requests
import uuid
from django.http import JsonResponse

def authenticate(request):
    code = request.GET.get('code')
    api_url = f'https://api.weixin.qq.com/sns/jscode2session?appid=앱ID&secret=앱비밀키&js_code={code}&grant_type=authorization_code'
    response = requests.get(api_url)
    data = response.json()
    
    token = str(uuid.uuid4())  # 사용자 토큰 생성
    
    try:
        user = User.objects.get(openid=data['openid'])
        user.session_key = data['session_key']
        user.token = token
        user.save()
    except User.DoesNotExist:
        user = User.objects.create(
            openid=data['openid'],
            session_key=data['session_key'],
            token=token,
            username=request.GET.get('nickName')
        )
    
    return JsonResponse({'token': token})

세션 관리 및 토큰 재생성:

session_key는 시간이 지나면 만료될 수 있습니다. 이를 해결하기 위해 사용자는 주기적으로 새 토큰을 요청해야 합니다.

userAuthCheck: function () {
  var that = this;
  wx.checkSession({
    success() {
      console.log('유효한 세션이 존재합니다.');
      that.getUserInfo();
    },
    fail() {
      console.log('세션이 만료되었습니다. 재로그인이 필요합니다.');
      that.onLogin();
    }
  });
}

위 과정을 통해 안전하고 효율적인 사용자 인증을 구현할 수 있습니다.

태그: DjangoRESTFramework weixinminiapp authentication

7월 13일 19:45에 게시됨