阿语python4-2 美多商城v5.0用户登录-QQ登录之第4.2.5节openid是否绑定用户的处理

news/2024/5/18 12:01:43 标签: jwt, cookie, sms, 云存储, 数据可视化

1. 判断openid是否绑定过用户

使用openid查询该QQ用户是否在美多商城中绑定过用户。

try:
    oauth_user = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
    # 如果openid没绑定美多商城用户
    pass
else:
    # 如果openid已绑定美多商城用户
    pass

2. openid已绑定用户的处理

如果openid已绑定美多商城用户,直接生成状态保持信息,登录成功,并重定向到首页。

try:
    oauth_user = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
    # 如果openid没绑定美多商城用户
    pass
else:
    # 如果openid已绑定美多商城用户
    # 实现状态保持
    qq_user = oauth_user.user
    login(request, qq_user)

    # 响应结果
    next = request.GET.get('state')
    response = redirect(next)

    # 登录时用户名写入到cookie,有效期15天
    response.set_cookie('username', qq_user.username, max_age=3600 * 24 * 15)

    return response

3. openid未绑定用户的处理

  • 为了能够在后续的绑定用户操作中前端可以使用openid,在这里将openid签名后响应给前端。

  • openid属于用户的隐私信息,所以需要将openid签名处理,避免暴露。

try:
    oauth_user = OAuthQQUser.objects.get(openid=openid)
except OAuthQQUser.DoesNotExist:
    # 如果openid没绑定美多商城用户
    access_token = generate_eccess_token(openid)
    context = {'access_token': access_token}
    return render(request, 'oauth_callback.html', context)
else:
    # 如果openid已绑定美多商城用户
    # 实现状态保持
    qq_user = oauth_user.user
    login(request, qq_user)

    # 重定向到主页
    response = redirect(reverse('contents:index'))

    # 登录时用户名写入到cookie,有效期15天
    response.set_cookie('username', qq_user.username, max_age=3600 * 24 * 15)

    return response

oauth_callback.html中渲染access_token

<input v-model="access_token" type="hidden" name="access_token" value="{{ access_token }}">

4. 补充itsdangerous的使用

  • itsdangerous模块的参考资料链接 http://itsdangerous.readthedocs.io/en/latest/

  • 安装:pip install itsdangerous

  • TimedJSONWebSignatureSerializer的使用

    • 使用TimedJSONWebSignatureSerializer可以生成带有有效期的token

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings

# serializer = Serializer(秘钥, 有效期秒)
serializer = Serializer(settings.SECRET_KEY, 300)
# serializer.dumps(数据), 返回bytes类型
token = serializer.dumps({'mobile': '18512345678'})
token = token.decode()

# 检验token
# 验证失败,会抛出itsdangerous.BadData异常
serializer = Serializer(settings.SECRET_KEY, 300)
try:
    data = serializer.loads(token)
except BadData:
    return None

补充:openid签名处理

  • oauth.utils.py

def generate_eccess_token(openid):
    """
    签名openid
    :param openid: 用户的openid
    :return: access_token
    """
    serializer = Serializer(settings.SECRET_KEY, expires_in=constants.ACCESS_TOKEN_EXPIRES)
    data = {'openid': openid}
    token = serializer.dumps(data)
    return token.decode()

http://www.niftyadmin.cn/n/739767.html

相关文章

阿语python4-2 美多商城v5.0用户登录-QQ登录之第4.2.6节openid绑定用户实现

openid绑定用户实现类似于用户注册的业务逻辑当用户输入的手机号对应的用户已存在直接将该已存在用户跟openid绑定当用户输入的手机号对应的用户不存在新建一个用户&#xff0c;并跟openid绑定class QQAuthUserView(View):"""用户扫码登录的回调处理""…

阿语python4-2 美多商城v5.0用户登录-QQ登录之第4.2.3节QQ登录工具QQLoginTool

QQ登录工具QQLoginTool1. QQLoginTool介绍该工具封装了QQ登录时对接QQ互联接口的请求操作。可用于快速实现QQ登录。2. QQLoginTool安装pip install QQLoginTool3. QQLoginTool使用说明1.导入from QQLoginTool.QQtool import OAuthQQ2.初始化OAuthQQ对象oauth OAuthQQ(client_i…

阿语python4-2 美多商城v5.0用户登录-QQ登录之第4.2.2节定义QQ登录模型类

定义QQ登录模型类QQ登录成功后&#xff0c;我们需要将QQ用户和美多商场用户关联到一起&#xff0c;方便下次QQ登录时使用&#xff0c;所以我们选择使用MySQL数据库进行存储。1. 定义模型类基类为了给项目中模型类补充数据创建时间和更新时间两个字段&#xff0c;我们需要定义模…

阿语python4-2 美多商城v5.0用户登录-qq登录之第4.2.1QQ登录开发文档

QQ登录开发文档QQ登录&#xff1a;即我们所说的第三方登录&#xff0c;是指用户可以不在本项目中输入密码&#xff0c;而直接通过第三方的验证&#xff0c;成功登录本项目。1. QQ互联开发者申请步骤若想实现QQ登录&#xff0c;需要成为QQ互联的开发者&#xff0c;审核通过才可实…

阿语python4-2 美多商城v5.0用户中心-添加和验证邮箱之第5.2.3节发送邮箱验证邮件...

发送邮箱验证邮件重要提示&#xff1a;发送邮箱验证邮件是耗时的操作&#xff0c;不能阻塞美多商城的响应&#xff0c;所以需要异步发送邮件。我们继续使用Celery实现异步任务。1. 定义和调用发送邮件异步任务1.定义发送邮件任务celery_app.task(bindTrue, namesend_verify_ema…

阿语python4-2 美多商城v5.0用户中心-添加和验证邮箱之第5.2.1节添加邮箱后端逻辑...

1. 添加邮箱接口设计和定义1.请求方式选项方案请求方法PUT请求地址/emails/2.请求参数参数名类型是否必传说明emailstring是邮箱3.响应结果&#xff1a;JSON字段说明code状态码errmsg错误信息2. 添加邮箱后端逻辑实现class EmailView(View):"""添加邮箱"&q…

阿语python4-2 美多商城v5.0用户中心-收货地址之第5.3.4节修改地址前后端逻辑

1. 修改地址接口设计和定义1.请求方式选项方案请求方法PUT请求地址/addresses/(?P<address_id>\d)/2.请求参数&#xff1a;路径参数 和 JSON参数名类型是否必传说明address_idstring是要修改的地址ID&#xff08;路径参数&#xff09;receiverstring是收货人province_id…

阿语python4-2 美多商城v5.0用户中心-收货地址之第5.3.3节展示地址前后端逻辑

1. 展示地址接口设计和定义1.请求方式选项方案请求方法GET请求地址/addresses/2.请求参数无3.响应结果&#xff1a;HTMLuser_center_site.html2. 展示地址后端逻辑实现class AddressView(LoginRequiredMixin, View):"""用户收货地址"""def get(s…