우아이드 프로그램에서 사용자를 식별하는 방법은 다음과 같습니다:
대부분의 웹 개발자들은 클라이언트가 요청을 보내면, 서버는 세션에 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();
}
});
}
위 과정을 통해 안전하고 효율적인 사용자 인증을 구현할 수 있습니다.