| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 前端Vue+后端Django实现微信登录 -> 正文阅读 |
|
[Python知识库]前端Vue+后端Django实现微信登录 |
一直想做网站的微信登录,虽然自己做用户系统也可以,但是我感觉每次创建账号非常麻烦,而且还要记密码,虽然浏览器也能够帮忙记住密码,但是也感觉不安全。 如果网站都统一用微信登录,就不用那么麻烦了,也不用注册账号,直接扫码即可。 准备工作:前端Vue+后端Django项目创建以及自动部署流程,网站接入微信登录需要域名备案的哦,所以必须在绑定域名的公网上测试,或者本地做内网穿透。 微信开放平台申请网站按照要求创建一个网站应用,需要准备一个网站信息登记表,这个比较麻烦,需要域名备案信息以及盖章。
微信登录流程获得相应的 AppID 和AppSecret,申请微信登录且通过审核后,可开始接入流程。 微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有 server 端的应用授权。该模式整体流程为:
获取access_token时序图: 前端Vue开发两种登录方式微信的扫码登录由两种方式:
我个人觉得第二种方式更简洁一些,而且不用做一些跳转,用户体验更好。第二种方式还支持自定义一些样式,例如二维码的大小、是否有标题等。 后面都是以实现第二种方式为目标进行开发。 引入
|
参数 | 是否必须 | 说明 |
---|---|---|
self_redirect | 否 | true:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。 |
id | 是 | 第三方页面显示二维码的容器id |
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
scope | 是 | 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可 |
redirect_uri | 是 | 重定向地址,需要进行UrlEncode |
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验 |
style | 否 | 提供"black"、"white"可选,默认为黑色文字描述。 |
href | 否 | 自定义样式链接,第三方可根据实际需求覆盖默认样式。 |
用户允许授权后,将会重定向到redirect_uri的网址上,并且带上 code 和state参数。
可以发现我们登录页面的URL和redirect_uri是一样的,相当于重定向到了自己然后添加了两个参数。所以我们可以写一个setInterval
,每隔一秒检查当前URL中是否包含code参数,如果有的话将code发送给后端,然后后端拿着code再去请求微信API即可拿到用户信息。
前端项目代码:https://github.com/Matrix-King-Studio/web_template_0_frontend
所以后端要做的事情也相对比较简单,只需要拿到code然后请求微信相应的接口即可。
核心代码:
@api_view(["GET"])
def wx_login(request):
# 微信扫码登录接口
params = {
"appid": settings.WeiXinWebAppID,
"secret": settings.WeiXinWebAppSecret,
"code": request.GET.get("code"),
"grant_type": "authorization_code"
}
res = requests.get("https://api.weixin.qq.com/sns/oauth2/access_token", params=params)
res = res.json()
access_token = res["access_token"]
openid = res["openid"]
# 获取用户信息
params = {
"access_token": access_token,
"openid": openid,
}
res = requests.get("https://api.weixin.qq.com/sns/userinfo", params=params)
res = res.json()
# 判断用户是否存在
account = Account.objects.filter(openid=openid).first()
if not account:
# 如果用户不存在,则创建用户
account = Account.objects.create(
openid=openid,
unionId=res["unionid"],
nickname=res["nickname"],
headImgUrl=res["headimgurl"]
)
# 根据用户信息生成JWT token
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(account)
token = jwt_encode_handler(payload)
# 返回用户信息 + token
return Response({
"token": token,
"account": {
"openid": account.openid,
"nickname": account.nickname,
"headImgUrl": account.headImgUrl
}
})
前端项目代码:https://github.com/Matrix-King-Studio/web_template_0_backend
大部分的工作其实都是在前期准备,包括域名备案、微信开发平台申请网站应用、开发者资质认证等等,实际敲代码的时间并没有很多。
参考文献:
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 12:11:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |