摘要:微信登錄的核心代碼依然采用這個(gè)庫。核心概念表結(jié)構(gòu)中控機(jī)中控機(jī)為同一引導(dǎo)用戶登錄的微信登錄服務(wù)器,其中此機(jī)器做的為截圖部分的,引導(dǎo)用戶授權(quán),微信回調(diào)到此中控機(jī),拿到。微信回調(diào)到后,拿著,跳轉(zhuǎn)到對(duì)應(yīng)的客戶域名。
背景
SaaS 作為一種服務(wù),需要為不同的客戶定制不同的域名以滿足客戶定制化的需求。而微信登錄時(shí)需要填寫一個(gè)回調(diào)地址,單一的回調(diào)地址是難以處理多客戶域名的業(yè)務(wù)需求的,經(jīng)過不同的 SaaS 項(xiàng)目的實(shí)踐,總結(jié)出了下面的方式。
微信登錄的核心代碼依然采用 psa 這個(gè)庫 https://github.com/python-soc...。
微信說明閱讀微信公眾平臺(tái)文檔,可以看到,當(dāng)同一個(gè)微信公眾號(hào)需要在多個(gè)服務(wù)間使用時(shí),微信的建議是提供一臺(tái)中控服務(wù)器,防止access_token的重復(fù)刷新,這個(gè)坑確實(shí)踩到過。
oauth 2.0https://tools.ietf.org/html/r...
核心概念、表結(jié)構(gòu) 中控機(jī)中控機(jī)為同一引導(dǎo)用戶登錄的微信登錄服務(wù)器,其中此機(jī)器做的為 oauth 2.0 截圖部分的 A、B,引導(dǎo)用戶授權(quán),微信回調(diào)到此中控機(jī),拿到code。
中控機(jī)通過state參數(shù),解出customerid,根據(jù)customer配置找到回調(diào)地址?;卣{(diào)是將state,code帶去回調(diào)的客戶域名。
customer表需要記錄微信的appid,appsecret,這樣即使客戶需要定制自己的微信公眾號(hào),中控機(jī)也可以saas化。
redirecturl由于微信的state參數(shù)長(zhǎng)度有限,因此提供一張redirecturl表記錄回調(diào)地址,登錄時(shí)只需要將redirecturl_id帶入state中即可。redirecturl記錄的為回調(diào)客戶域名+psa complete地址的完整路由。
statestate為oauth 2.0中允許的回調(diào)參數(shù),state的構(gòu)成為: 客戶id,回調(diào)地址id,其他需要回調(diào)參數(shù)
核心流程 核心代碼中控機(jī)通過customer獲取對(duì)應(yīng)的appid,secret。微信回調(diào)到cherrypick后,拿著code,state跳轉(zhuǎn)到對(duì)應(yīng)的客戶域名。
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 服務(wù)器處理 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等參數(shù) 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)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43031.html
摘要:企業(yè)通過微信微博等為消費(fèi)者提供社交認(rèn)證或其他更多第三方身份提供商。支持多樣身份提供方案良好的身份管理解決方案應(yīng)該支持幾乎所有流行的身份來源。易于遷移應(yīng)支持移入和移出身份管理解決方案而不受限 IDaaS 身份即服務(wù)是隨著云計(jì)算發(fā)展起來的新軟件即服務(wù)。 showImg(https://segmentfault.com/img/remote/1460000020177039?w=800&h=...
摘要:微信年月日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由個(gè)調(diào)整為個(gè)。大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開發(fā)時(shí),授權(quán)回調(diào)的域名只能設(shè)置一個(gè),正常的開發(fā)一般一套環(huán)境就對(duì)應(yīng)一個(gè)域名。 微信2018年11月16日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由2個(gè)調(diào)整為1個(gè)。企業(yè)類主體注冊(cè)公眾號(hào)數(shù)量上限由5個(gè)調(diào)整為2個(gè)。這個(gè)對(duì)馬上要注冊(cè)公眾號(hào)的企業(yè)來說頓時(shí)心情不好了。 大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開發(fā)時(shí),授權(quán)回調(diào)...
摘要:因?yàn)槲⑿殴娞?hào)是騰訊云的,所以強(qiáng)烈推薦騰訊云。購買成功后,可以看到如下界面選購域名因?yàn)榉?wù)器對(duì)外使用,要么直接用,要么綁定一個(gè)域名,而微信公眾號(hào)必須要綁定域名,因此,提前注冊(cè)一個(gè)域名吧。 node 跑通 微信公眾號(hào) 開發(fā)者功能 關(guān)鍵字: node express 服務(wù)器 域名 centos 微信公眾號(hào) 自定義 開發(fā) nginx 文末 擴(kuò)展 有驚喜?。?! 好玩的功能 文末 擴(kuò)展 有驚喜...
閱讀 1790·2021-10-11 10:59
閱讀 2442·2021-09-30 09:53
閱讀 1816·2021-09-22 15:28
閱讀 2825·2019-08-29 15:29
閱讀 1590·2019-08-29 13:53
閱讀 3236·2019-08-29 12:34
閱讀 2887·2019-08-26 10:16
閱讀 2686·2019-08-23 15:16