openid是否绑定用户的处理

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

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

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

2. openid已绑定用户的处理

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

 try:
    # 查看是否有 openid 对应的用户
    oauth_qq = OAuthQQUser.objects.get(openid=openid)

except OAuthQQUser.DoesNotExist:
    # 如果 openid 没绑定美多商城用户
    # 请查看:  openid 未绑定用户的处理
    pass
else:
    # 如果 openid 已绑定美多商城用户
    # 根据 user 外键, 获取对应的 QQ 用户(user)
    user = oauth_qq.user

    # 实现状态保持
    login(request, user)

    # 创建重定向到主页的对象
    response = http.JsonResponse({'code': 0, 'errmsg': 'ok'})

    # 将用户信息写入到 cookie 中,有效期14天
    response.set_cookie('username', user.username, max_age=3600 * 24 * 14)

    # 返回响应
    return response

3. openid未绑定用户的处理

  • 为了能够在后续的绑定用户操作中前端可以使用openid,在这里将openid签名后响应给前端。
  • openid属于用户的隐私信息,所以需要将openid签名处理,避免暴露。
try:
    # 查看是否有 openid 对应的用户
    oauth_qq = OAuthQQUser.objects.get(openid=openid)

except OAuthQQUser.DoesNotExist:
    # 如果 openid 没绑定美多商城用户,进入这里: 
    # 使用加密类加密 openid
    access_token = generate_access_token({'openid':openid})
    # 注意: 这里一定不能返回 0 的状态码. 否则不能进行绑定页面
    return http.JsonResponse({'code':300,'errmsg':'ok','access_token':access_token})
else:
    ...

4. 补充itsdangerous的使用

  • itsdangerous模块的参考资料链接https://itsdangerous.readthedocs.io/en/1.1.x/

  • 安装: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
from itsdangerous import BadData
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings


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

def check_access_token(access_token):
    """
    提取openid
    :param access_token: 签名后的openid
    :return: openid or None
    """
    serializer = Serializer(settings.SECRET_KEY, expires_in=3600)
    try:
        data = serializer.loads(access_token)
    except BadData:
        return None
    else:
        return data.get('openid')