资讯专栏INFORMATION COLUMN

SaaS化实践——如何用一个微信公众号登录多个不同的域名

alanoddsoff / 723人阅读

摘要:微信登录的核心代码依然采用这个库。核心概念表结构中控机中控机为同一引导用户登录的微信登录服务器,其中此机器做的为截图部分的,引导用户授权,微信回调到此中控机,拿到。微信回调到后,拿着,跳转到对应的客户域名。

背景

SaaS 作为一种服务,需要为不同的客户定制不同的域名以满足客户定制化的需求。而微信登录时需要填写一个回调地址,单一的回调地址是难以处理多客户域名的业务需求的,经过不同的 SaaS 项目的实践,总结出了下面的方式。

微信登录的核心代码依然采用 psa 这个库 https://github.com/python-soc...。

微信说明

阅读微信公众平台文档,可以看到,当同一个微信公众号需要在多个服务间使用时,微信的建议是提供一台中控服务器,防止access_token的重复刷新,这个坑确实踩到过。

oauth 2.0

https://tools.ietf.org/html/r...

核心概念、表结构 中控机

中控机为同一引导用户登录的微信登录服务器,其中此机器做的为 oauth 2.0 截图部分的 A、B,引导用户授权,微信回调到此中控机,拿到code。
中控机通过state参数,解出customerid,根据customer配置找到回调地址。回调是将state,code带去回调的客户域名。

customer

customer表需要记录微信的appid,appsecret,这样即使客户需要定制自己的微信公众号,中控机也可以saas化。

redirecturl

由于微信的state参数长度有限,因此提供一张redirecturl表记录回调地址,登录时只需要将redirecturl_id带入state中即可。redirecturl记录的为回调客户域名+psa complete地址的完整路由。

state

state为oauth 2.0中允许的回调参数,state的构成为: 客户id,回调地址id,其他需要回调参数

核心流程

核心代码

中控机通过customer获取对应的appid,secret。微信回调到cherrypick后,拿着code,state跳转到对应的客户域名。

def _auth(request, backend):
    cid = request.GET["cid"]
    # TODO: DoesNotExist
    customer = Customer.objects.get(id=cid)
    appid, appsecret = customer.get_key_and_secret()
    log.info("login cid:%s, key:%s", cid, appid)
    def get_key_and_secret():
        return appid, appsecret
    request.backend.get_key_and_secret = get_key_and_secret
    return do_auth(request.backend)

@never_cache
@psa("our_social:cherrypick")
def auth(request, backend, key=""):
    return _auth(request, backend)
    
@never_cache
@psa()
def cherrypick(request, backend):
    code = request.GET.get("code", "")
    state = request.GET.get("state", "")
    redirect_url_id = state.split(",")[0]
    redirect_url = RedirectURL.objects.get(id=redirect_url_id).url
    redirect_url = "{}?code={}&state={}".format(redirect_url, code, state)
    log.info("cherrypick, redirect_url: %s, state: %s", redirect_url, state)
    return redirect(redirect_url)    

SaaS 服务器处理 oauth 2.0 C、D之后的步骤

@psa("our_social:complete")
def complete(request, backend, *args, **kwargs):
    """Authentication complete view"""
    logout(request)
    state = request.GET.get("state", "") 
    ......
    state解析出cid等参数
    customer = Customer.objects.get(id=cid)
    appid, appsecret = product.get_key_and_secret()
    request._customer = customer
    覆盖backend的方法
    def get_key_and_secret():
        log.info("login complete use appid: %s %s", appid, state)
    request.backend.get_key_and_secret = get_key_and_secret
    return do_complete(request.backend, _do_login, request.user,
                       redirect_name=REDIRECT_FIELD_NAME, request=request,
                       *args, **kwargs)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43031.html

相关文章

  • 走进身份管理-IAM/IDaaS

    摘要:企业通过微信微博等为消费者提供社交认证或其他更多第三方身份提供商。支持多样身份提供方案良好的身份管理解决方案应该支持几乎所有流行的身份来源。易于迁移应支持移入和移出身份管理解决方案而不受限 IDaaS 身份即服务是随着云计算发展起来的新软件即服务。 showImg(https://segmentfault.com/img/remote/1460000020177039?w=800&h=...

    gghyoo 评论0 收藏0
  • 企业只能申请两个微信公众微信开发不够用?不,一个公众就够了!

    摘要:微信年月日发公告称,个人主体注册公众号数量上限由个调整为个。大家都知道每个微信公众号在进行开发时,授权回调的域名只能设置一个,正常的开发一般一套环境就对应一个域名。 微信2018年11月16日发公告称,个人主体注册公众号数量上限由2个调整为1个。企业类主体注册公众号数量上限由5个调整为2个。这个对马上要注册公众号的企业来说顿时心情不好了。 大家都知道每个微信公众号在进行开发时,授权回调...

    wthee 评论0 收藏0
  • 最详细微信公众搭建一条龙

    摘要:因为微信公众号是腾讯云的,所以强烈推荐腾讯云。购买成功后,可以看到如下界面选购域名因为服务器对外使用,要么直接用,要么绑定一个域名,而微信公众号必须要绑定域名,因此,提前注册一个域名吧。 node 跑通 微信公众号 开发者功能 关键字: node express 服务器 域名 centos 微信公众号 自定义 开发 nginx 文末 扩展 有惊喜!!! 好玩的功能 文末 扩展 有惊喜...

    ztyzz 评论0 收藏0

发表评论

0条评论

alanoddsoff

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<