登录流程
首先到微信开放平台查看网站应用开发登录微信的api文档,梳理出第三方微信登录的流程如下:
- 发送第三方登录请求
- 重定向到微信认证服务器
- 发送登录信息并校验(携带 appid,redirect_uri,status)
- 重定向到redirect_uri,返回code
- 发送code请求access_token
- 校验code,返回access_token
- 用access_token获取用户信息
实现
在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核。
在users的urls中进行路由配置:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^weixin_login/$', views.WeiXinLogin.as_view()),
re_path(r'^redirect/$', views.get_redirect)
]
在users的views下进行视图编码:
import traceback
import requests
from django.views import View
from django.http import HttpResponseRedirect
APPID = 'wxe0d95453c412f118' # 你自己的
APPSECRET = 'd785bt925fbc7ebed62734cfdpe5951c' # 你自己的
Code = ''
State = ''
class WeiXinLogin(View):
def get(self, request):
# 获取前端传递过来的code跟state
try:
code = request.GET.get("code")
state = request.GET.get("state")
except Exception as e:
print("获取code和stat参数错误:\n%s" % str(traceback.format_exc()))
# 2.通过code换取网页授权access_token
try:
url = u'https://api.weixin.qq.com/sns/oauth2/access_token'
params = {
'appid': APPID,
'secret': APPSECRET,
'code': Code,
'grant_type': 'authorization_code'
}
token_res = requests.get(url, params=params).json()
access_token = token_res["access_token"]
openid = token_res["openid"]
except Exception as e:
print("获取access_token参数错误:\n%s" % str(traceback.format_exc()))
access_token = ''
openid = ''
# 3.如果access_token超时,那就刷新
# 注意,这里我没有写这个刷新功能,不影响使用,如果想写的话,可以自己去看文档
# 4.拉取用户信息
try:
user_info_url = u'https://api.weixin.qq.com/sns/userinfo'
params = {
'access_token': access_token,
'openid': openid,
}
res = requests.get(user_info_url, params=params).json()
print('获取的用户信息:%s' % res)
except Exception as e:
print("拉取用户信息错误:\n%s" % str(traceback.format_exc()))
def get_redirect(request):
"""
返回重定向地址给前端获取code和state
"""
ip = request.get_host()
host = 'http://' + ip + '/login'
return_url = 'https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&' \
'response_type=code&scope=SCOPE&state=%s#wechat_redirect' % (APPID, host, State)
return HttpResponseRedirect(return_url)
总结
微信、qq和微博等第三方登录的整体流程相差不大,本代码中仅实现了第三方登录相关代码,后续会补齐jwt的方式进行用户登录的认证。