Web应用多账号系统设计及微信扫码登录实现

Web应用多账号系统设计及微信扫码登录实现

1   前言概述

公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表。

此MIS系统特点如下:

  • 仅内部人员使用
  • 部署在公网

基于如上特点,显然让公司的人为这样一个内部系统而实现一个完整的账号不太现实,要兼顾隐私性和便捷性的需求,作者想到了使用微信扫码登录来做为身份认证,然后后台管理员审核,这样就可以达到如下的效果:

  • 可以实现无门槛注册(微信扫一扫就完成注册),保证了便捷性
  • 系统对未审核通过的人员进行隔离,保证了隐私性

然后在开发完毕此系统后,觉得有必要再总结而且小升华一下,于是就有了本文的写作动机。

2   多账号原理

本来本文的目的是 “实现微信扫码登录” ,但是后来觉得仅仅是为了实现这个功能,本文的立意又显得太低。所以就在此处扩展一下为 “多账号授权登录系统” 。

在近些年来,随着互联网越来越开发和协作,目前的系统登录方式也越来越多,已经远远超越了以前的单用户名的方式了。除了用户名密码外,一般网站还提供如下的登录方式:

  • 第三方授权
    • 微信/QQ/新浪微博(国内)
    • Google/Facebook/Github(国外)
  • 绑定账号
    • 手机号
    • 邮箱号

基于如上的几种登录方式,就形成了如下的 “多账号登录体系图”

基本原理:

  • 第三方授权
    • 能够从可信第三方获取到相应的返回值(用户信息),然后和 user_id 绑定
    • 不需要额外再输入密码便完成鉴权过程
    • 会创建一组今后可以修改的 user_id 作为 占位用户
    • 鉴权成功后设置session状态
  • 绑定账号
    • 事先已经完成了 user_id 的注册
    • 完成了相应账号绑定,即表示认可和 user_id 均能登录
    • 使用和 user_id 同样的或者不同的密码体系(一般使用相同密码)登录完成鉴权
    • 鉴权成功后设置session状态

关于 绑定账号 的方式比较简单,此处就不再赘述。

基于 第三方授权 的方式,则比较精妙,可学习性比较强,因为基于互联网越来越开放的特性,此方式肯定会越来越多的被应用,越来越成为主流。下面将以 微信扫码 授权登录为例子来进行讲解。

3   扫码登录逻辑

使用 微信扫码 授权登录的逻辑图如下:

其中主要处理的事情如下:

  • 向第三方发起鉴权请求
  • 第三方鉴权回调
  • 和MIS系统本地 user_id 体系关联(新建用户)
  • 设置session登录状态
  • 处理不同结果的显示界面

4   微信扫码过程

使用过微信扫码登录系统的人会有如下的过程体验(以著名社交网站 知乎 为例子):

  1. 打开 知乎 主页,点击 “微信登录” 的图标
  2. 浏览器重定向到微信域(见下图标记1)下面的二维码页面
  3. 用户掏出手机打开微信,扫一扫
  4. 在手机微信上点击授权
  5. PC上面的二维码页面显示授权成功,并转向到 知乎 首页,认证成功

整个过程对于终端用户来说,只有短短几秒,而且不用输入任何密码,可以说是一种非常安全又便捷的体验。

那么问题来了,通过微信扫描二维码,并完成MIS系统注册登录这个短短几秒的时间里面,到底发生了哪些事情?

通过浏览器抓包,对几个关键通讯过程进行分析。

PC浏览器会依次发起两个长连接(比较长时处于 pending 状态)的请求:

  • 等待手机端的微信扫码(上图标记2)
  • 等待手机微信点击 “确认登录” 按钮(上图标记3)

这两个状态都会反馈到PC端的二维码页面,在手机端完成确认后,PC浏览器上面的页面就会生定向到授权后的页面(如 知乎 首页)。

具体各方通讯时序图如下:

上图对整个过程中通讯涉及的对象进行了清楚的描述,关于上图数字标注部分注解如下:

  1. 网站服务器向微信API传入带有 回调url 的参数
  2. 手机微信通过摄像头扫二维码,从 光学原理 上完成数据的传递
  3. PC浏览器上查询扫码状态的长连接收到返回的状态值,并更新提示
  4. PC浏览器上查询手机客户端点击确认按钮的状态值,并更新提示,然后重定向到 过程1 中传递url地址上
  5. 网站服务器在授权成功后,完成本系统的用户注册或者登录的业务逻辑
  6. 网站服务器重定向到用户登录成功的界面中(如果对于新注册用户不需要额外的审核的话)

关于微信扫码认证部分的开发,本文不再赘述,只给出如下注意事项:

  • 微信平台的各种API接口请参考:微信开放平台提供的官方文档
  • 微信扫码登录的开发权限需要在微信开放平台中进行企业资质认证(个人用户无法获得)
  • 回调url 的域必需在微信开放平台中进行填写备案,本地开发时传递的 回调url 参数必须和备案一致

5   代码实现

根据如上原理,最后将提供具体实现代码以供参考 ,为了简洁,有一些通用的工具函数的具体实现就不贴出来了。

使用 python3.5 实现 微信扫码登录Web应用程序 的参考代码如下所示。

对应 上图标识1 中的代码实现:

class WeChatAuth(MyBaseHandler):
    """
    点击后直接重定向到微信登录界面

    - wechat QR扫码登录,web端
    - 直接重定向到微信的页面
    """

    def get(self):
        state = get_uuid1_key()  # 生成唯一的码

        wx_qr_param = dict(
            appid=wx_webapp.appid,
            # redirect_uri=wx_webapp.qr_auth_cb_url,
            redirect_uri=‘http://your.domain.com/wechat/wechat-auth-callback/‘,
            response_type=‘code‘,
            scope=wx_webapp.login_scope,
            state=state
        )  ##wechat_redirect

        wx_qr_url = ‘https://open.weixin.qq.com/connect/qrconnect?%s#wechat_redirect‘                     % urllib.parse.urlencode(wx_qr_param)

        self.redirect(wx_qr_url)

对应 上图标识2 中的代码实现:

class WeChatAuthCallback(MyBaseHandler):
    """
    微信第三方认证之后,开始将此用户在本系统沉淀下来

    - 用于微信服务器传回code的值
    - 此处要再请求获得access_token
    """

    async def get(self):
        wx_code = self.get_argument(‘code‘, ‘‘)
        wx_state = self.get_argument(‘state‘, ‘‘)

        if wx_code == ‘‘:
            res = ConstData.msg_forbidden
            dlog.debug(res)
            self.write(res)
            return

        dlog.debug(‘wx_code:%s,wx_state:%s‘ % (wx_code, wx_state))

        access_token_res = wx_webapp.get_auth_access_token(code=wx_code, state=wx_state)
        user_info = wx_webapp.get_auth_user_info(auth_access_token_res=access_token_res)
        """:type:WeChatUser"""  # 微信返回的用户信息串

        if user_info is None:
            res = ConstData.msg_forbidden
            dlog.debug(res)
            self.write(res)
            return

        wechat_user = await MisWeChatUser.objects.get(openid=user_info.openid, unionid=user_info.unionid)
        """:type:MisWeChatUser"""
        # 一个Open_id下面所有的id都是靠union来区分账号

        if wechat_user is not None:
            user = await User.objects.get(user_id=wechat_user.user_id)
            assert user is not None
            if user.active:
                if await user.is_online():
                    await self.update_session()  # 更新时间
                else:
                    await self.create_session(user)  # 新增加一个session
                self.write(‘in authorized page‘)
                # self.redirect(‘/‘)  # todo 重定向到登录授权后的主页
                return

        # 如果不存在wechat备案信息,则需要备案wechat信息,而且新注册初始账号
        default_new_user_id = ‘u_‘ + get_uuid1_key()

        new_wechat_user = MisWeChatUser(
            openid=user_info.openid,
            nickname=user_info.nickname,
            unionid=user_info.unionid,
            # user_id=wx_webapp.appid + ‘_‘ + user_info.unionid,  # 通过微信号登录生成的一个唯一的用户名,后面可以提供修改
            user_id=default_new_user_id,
            appid=wx_webapp.appid
        )
        new_wechat_user.set_default_rc_tag()

        # rand_salt = get_rand_salt()
        new_user = User(
            user_id=default_new_user_id,
            # salt=rand_salt,  # 防止别人md5撞库反向破解的随机数
            # passwd=StringField()  # 密码,通过第三方登录的默认不设置
            first_name=user_info.nickname,
            status=FieldDict.user_status_init,  # 表示是可更改状态
            active=False,
        )
        new_user.set_default_rc_tag()

        await new_wechat_user.save()
        await new_user.save()
        self.write(‘in unauthorized page‘)

        # self.redirect(URL_ROOT)  # todo 导入到未授权的页面

6   功能测试

设计两组测试用例。

检查微信用户扫码后能否完成上述流程:

  1. 用A微信账号扫码登录,查看是否自动注册
  2. 是否提示重定向到 “未授权页面”

在数据库中修改A微信自动注册的用户状态为审核通过后再扫码登录:

  1. 修改A用户状态为 active=True
  2. 是否提示重定向到 “授权页面”
  3. 是否在数据库中看到登录的session状态

测试截图如下:

7   小结

如果我是一个产品经理,如果我做一个web应用的产品,那么在产品早期阶段,我肯定会选择微信登录的方式,因为这种方式的登录门槛实在是太低了,用户试用产品的门槛也降到了最低,后续的活跃程度至少不会受到登录的门槛的影响。

可惜,还有好多产品经理不懂这个,这么重要的入口都没有稍微花点心思去打磨。

时间: 2024-08-07 07:00:13

Web应用多账号系统设计及微信扫码登录实现的相关文章

微信开放平台开发——网页微信扫码登录(OAuth2.0)

.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问

C#开发微信门户及应用(45)--微信扫码登录

在前面随笔<C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理>介绍了基于微信开放平台接口实现的微信扫码直接登录的过程.本篇介绍对扫码登录的一些改进和处理,以便更方便应用在实际项目中. 1.扫码登录配置处理 在我前面的随笔扫码登录处理中,介绍了账号登陆和扫码登录并存的情况,有时候我们可能想只是允许用户扫码登录即可,也就是不需要账号登陆,这种情况我们可以通过进行配置实现处理.例如我在一个基于微信的系统应用里面,通过配置实现了仅仅允许扫码登录的效果.也就是我们可以根据配置,因此其他登

(转)微信扫码登录网页实现原理

扫码登录操作过程 浏览器输入:https://wx.qq.com/?lang=zh_CN 手机登录微信,利用“扫一扫”功能扫描网页上的二维码 手机扫描成功后,提示“登录网页版微信”:网页上显示“成功扫描 请在手机点击确认以登录” 手机端点击“登录网页版微信”,网页跳转到用户的微信操作界面 整个扫码登录的操作过程还是挺简单的,而且交互地实时性比较好,如果网络不是非常阻塞,整个过程还是非常快的. 扫码登录原理 扫码登录大概的思路是:微信手机客户端从网页二维码里面得到一些信息,然后发送给网页微信的服务

微信扫码登录

一.微信官方参考文档地址: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN 首先你需要在微信开放平台申请一个微信网站应用,获取 AppID:aaaaaaaaabbcc AppSecret: sfasfsafsafsafsads 二.jsp页面代码 <%@

微信扫码登录asp微信扫码登陆代码

网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录用户名,全程自动操作更方便.源码是用asp写的,mdb的数据库,微信扫描电脑网页上的二维码实现登录. 只需要用微信扫一下二维码,这个网站就可以展示你的微信昵称和头像,免去注册账号和输入密码登录的步骤,还免去设置头像和昵称的步骤,所以是挺方便的.我这个asp写好的代码和微信开放平台不同,微信开放平台

网站使用微信扫码登录流程

微信扫码登录是一个标准的oauth 2.0的过程. 1.用户请求访问网站,选择微信登录. 2.redirect到微信二维码页面 3.获取微信登录二维码,请求参数包括本网站的appId和登录成功后跳转回的地址,即relaystate. 4.返回二维码网页. 5.二维码扫入手机. 6.微信客户端将微信用户信息和二维码内的信息传给微信后台. 7.微信后台返回给浏览器授权成功,并附带授权码. 8.浏览器重定向到relaystate的地址,并将授权码作为参数传给网络后台. 9.网站将授权码和自己的地址发给

[小小造梦]个人应用实现微信扫码登录

效果预览demo测试: https://ninetyteam.79px.com/ 原型地址 https://minapp.79px.com/demand/ 需求梳理解析 https://mp.weixin.qq.com/s?__... 个人应用实现微信扫码登录.需求梳理与具体实现方案.下面这篇,可以联合起来看-.- 迭代 http://mp.weixin.qq.com/s?__b... 实际的代码,我已经把流程梳理完毕了.有需要的可以找我要源码.或者我们可以合作完善.不过我的重心放在自己的另外一

php微信开放平台--第三方网页微信扫码登录(OAuth2.0)

第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的

微信扫码登录实现原理

扫码登录是如何实现的? 网页版微信刚推出时,无数人被它的登录方式惊艳了一下,不需要输入用户名密码,打开手机微信扫一扫,便自动登录.从原理上讲,二维码只能是一段文本的编码,如何用它实现快捷登录的呢? 打开网页版微信,可以看到如下的页面: 微信扫码界面 如果你用我查查.支付宝.新浪微博等软件扫码二维码,你会发现此二维码解析出来是如下的网址: https://login.weixin.qq.com/l/obsbQ-Dzag== 接下来详细介绍一下扫码登录具体的每个步骤: 第一步:用户 A 访问微信网页