Django 는 위 챗 애플 릿 의 로그 인 인증 기능 을 실현 하고 로그 인 상 태 를 유지 합 니 다.

이번에 스스로 작은 프로그램 을 만들어 서 로그 인 에 있어 서 모호 해 졌 고 인터넷 에서 많은 문 서 를 본 후에 다음 과 같은 해결 방안 을 얻 었 다.
환경 설명:
1.작은 프로그램 은 openid 만 받 고 다른 정 보 는 저장 하지 않 습 니 다.
2.Django 가 가지 고 있 는 User 류 는 적합 하지 않 습 니 다.
구체 적 인 작업 절차:
1.사용자 가 작은 프로그램 에 들 어가 면 호출wx.login()하여 임시 로그 인 증빙 코드 를 가 져 옵 니 다.wx.login()사용 자 는 감지 되 지 않 습 니 다.
2.wx.request()을 통 해 code 를 개발 자 서버 의 백 엔 드 프로그램 에 전송 합 니 다.
3.배경 에서 code 를 받 은 후 위 챗 이 제공 하 는 인 터 페 이 스 를 호출 하여 openid 와 session 을 가 져 옵 니 다.key,
4.배경 사용자 정의 사용자 시트,openid 를 사용자 이름 으로 하고 사용자 비밀 번 호 를 설정 하지 않 습 니 다.사용자 가 존재 하지 않 으 면 새 사용 자 를 만 듭 니 다.이 어 openid 와 session 에 따라key 새로운 사용자 정의 로그 인 상태 생 성 3rdsession(여기 서 skey 로 표시)을 애플 릿 에 되 돌려 줍 니 다.
5.배경 에서 skey 를 캐 시 에 저장(Redis)하고 2 시간 만 료 로 설정 합 니 다.
6.작은 프로그램 이 skey 를 받 았 습 니 다.로그 인 성공 을 설명 하고 skey 를 로 컬 Storage 에 저장 합 니 다.다음 요청 시 요청 머리 에 skey 를 가 져 옵 니 다.
7.배경 에서 요청 을 받 고 요청 헤더 에서 skey 를 받 아 캐 시 에 이 skey 가 있 는 지 판단 합 니 다.있 으 면 로그 인 상태 에 있 는 지 설명 하고 요청 과 관련 된 작업 을 수행 할 수 있 습 니 다.없 으 면 다시 로그 인 해 야 한 다 는 설명 을 하고 애플 릿 에 401 을 되 돌려 줍 니 다.
제3자 라 이브 러 리:Django,Djando rest framework,Django-redis
사용자 정보
사용자 정의 사용자 클래스
models.py

from django.db import models
from django.utils import timezone
class User(models.Model):
 openid = models.CharField(max_length=50, unique=True)
 created_date = models.DateTimeField(auto_now_add=True)
사용자 인터페이스 직렬 화
serializers.py

from rest_framework import serializers
from django.utils import timezone
from .models import User
class UserSerializer(serializers.ModelSerializer):
 class Meta:
 model = User
 fields = '__all__'
로그 인 인터페이스 디자인
views.py

import hashlib
import json
import requests
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from django_redis import get_redis_connection
from .models import User
from .serializers import UserSerializer
@api_view(['POST'])
def code2Session(request):
 appid = ''
 secret = ''
 js_code = request.data['code']
 url = 'https://api.weixin.qq.com/sns/jscode2session' + '?appid=' + appid + '&secret=' + secret + '&js_code=' + js_code + '&grant_type=authorization_code'
 response = json.loads(requests.get(url).content) #  json       
 if 'errcode' in response:
 #     
 return Response(data={'code':response['errcode'], 'msg': response['errmsg']})
 #     
 openid = response['openid']
 session_key = response['session_key']
 #   openid,               openid
 user, created = User.objects.get_or_create(openid=openid)
 user_str = str(UserSerializer(user).data)
 #         ,     
 sha = hashlib.sha1()
 sha.update(openid.encode())
 sha.update(session_key.encode())
 digest = sha.hexdigest()
 #              ,       
 conn = get_redis_connection('default')
 conn.set(digest, user_str, ex=2*60*60)
 return Response(data={'code': 200, 'msg': 'ok', 'data': {'skey': digest})
그 중에서 redis 의 설치,설정 과 사용 은 이 문 서 를 참고 할 수 있 습 니 다.
로그 인 후,skey 를 애플 릿 에 되 돌려 주 고,애플 릿 은 로 컬 에 저장 하 며,다음 에는 skey 를 가 져 다 달라 고 요청 합 니 다.
사용자 로그 인 인증
제 User 클래스 는 사용자 정의 입 니 다.skey 도 사용자 정의 입 니 다.token 이나 jwt 등 기술 을 사용 하지 않 았 기 때문에 사용자 정의 로그 인 인증 이 필요 합 니 다.보기 에서 해당 하 는 요청 처리 함 수 를 실행 하기 전에 skey 를 판단 하고 skey 에서 openid 의 값 을 얻 을 것 이 라 고 판단 합 니 다.
나 는 여기 서 몇 가지 방법 을 고려 했다.
1.Django 미들웨어 를 이용 하여,
2、장식 기 를 이용 하여,
3、rest 이용프레임 워 크 인증 클래스,
Django 의 요청 처리 절 차 를 먼저 분석 합 니 다.

위의 그림 에서 알 수 있 듯 이 미들웨어 에서 인증 을 하 는 것 은 완전히 가능 하 다.인증 이 통과 되 지 않 으 면 바로 돌아 갈 수 있 고 경로 맵 표 와 보기 에 도착 하지 않 아 도 된다.하지만 restframework 에서 request 를 봉 인 했 습 니 다.중간 부품 의 request 는 django 의 HttpRequest 이 고 rest 입 니 다.framework 는 django 의 request 를rest_framework Request로 패키지 합 니 다.
장식 기 라면 이번 디자인 에서 유연성 이 부족 합 니 다.로그 인 인 인 터 페 이 스 를 제외 하고 다른 인터페이스의 모든 method 는 인증 을 해 야 하기 때 문 입 니 다.
그래서 종합 적 으로 고려 하여 rest 를 사용자 정의 합 니 다.프레임 워 크 의 인증 클래스 는 이번 애플 릿 의 인증 에 가장 적합 합 니 다.인증 클래스 에 request.user 를 설정 한 다음 보기 에서 request.user 를 통 해 사용자 정 보 를 직접 얻 을 수 있 습 니 다.
다음은 rest 를 분석 해 보 겠 습 니 다.framework 의 소스 코드,어떻게 인증 하 는 지 보 세 요.

위의 그림 소스 코드 분석 에서 알 수 있 듯 이 마지막 으로 인증 류 의 인증 방법 을 호출 했다.authenticator.authenticate(). 그리고 restframework 자체 인증 류 는rest_framework.authentication에서

다음은 이번 애플 릿 디자인 에 적용 되 는 인증 클래스 를 사용자 정의 합 니 다:새 authentication.py 파일

from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication
from django_redis import get_redis_connection
class UserAuthentication(BaseAuthentication):
 def authenticate(self, request):
 if 'HTTP_SKEY' in request.META:
  skey = request.META['HTTP_SKEY']
  conn = get_redis_connection('default')
  if conn.exists(skey):
  user = conn.get(skey) 
  return (user, skey)
  else:
  raise exceptions.AuthenticationFailed(detail={'code': 401, 'msg': 'skey   '})
 else:
  raise exceptions.AuthenticationFailed(detail={'code': 400, 'msg': '  skey'})
 def authenticate_header(self, request):
 return 'skey'
마지막 으로 전역 설정DEFAULT_AUTHENTICATION_CLASSE을 이용 하여UserAuthentication을 전역 으로 설정 하고 로그 인 인 인 터 페 이 스 는 인증 류 를 사용 하지 않 고 로그 인 인 인 터 페 이 스 를 두 줄 코드 로 추가 해 야 한다.
settings.py 파일:

REST_FRAMEWORK = {
 'DEFAULT_AUTHENTICATION_CLASSES': (
 'note.authentication.UserAuthentication', #         
 ),
 'DEFAULT_RENDERER_CLASSES': (
 'rest_framework.renderers.JSONRenderer',
 ),
 'DEFAULT_PARSER_CLASSES': (
 'rest_framework.parsers.JSONParser',
 ),
}
로그 인 인터페이스

import hashlib
import json
import requests
from rest_framework import status
from rest_framework.decorators import api_view, authentication_classes
from rest_framework.response import Response
from django_redis import get_redis_connection
from .models import User
from .serializers import UserSerializer
@api_view(['POST'])
@authentication_classes([]) #   
def code2Session(request):
 appid = ''
 secret = ''
 js_code = request.data['code']
 url = 'https://api.weixin.qq.com/sns/jscode2session' + '?appid=' + appid + '&secret=' + secret + '&js_code=' + js_code + '&grant_type=authorization_code'
 response = json.loads(requests.get(url).content) #  json       
 if 'errcode' in response:
 #     
 return Response(data={'code':response['errcode'], 'msg': response['errmsg']})
 #     
 openid = response['openid']
 session_key = response['session_key']
 #   openid,               openid
 user, created = User.objects.get_or_create(openid=openid)
 user_str = str(UserSerializer(user).data)
 #         ,     
 sha = hashlib.sha1()
 sha.update(openid.encode())
 sha.update(session_key.encode())
 digest = sha.hexdigest()
 #              ,       
 conn = get_redis_connection('default')
 conn.set(digest, user_str, ex=2*60*60)
 return Response(data={'code': 200, 'msg': 'ok', 'data': {'skey': digest})
이후 인터페이스 에서request.user를 통 해 이번 요청 한 사용자 정 보 를 얻 을 수 있다.
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 Django 가 위 챗 애플 릿 의 로그 인 인증 기능 을 실현 하고 로그 인 상 태 를 유지 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기