日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
不就是個(gè)短信驗(yàn)證嘛,還真挺復(fù)雜的

支撐子域是為了項(xiàng)目成功必須要處理的問(wèn)題,但由于沒(méi)有現(xiàn)成、成熟的解決方案,必須要定制,費(fèi)時(shí)費(fèi)力。

如果能恰當(dāng)?shù)刈R(shí)別支撐子域的邊界,形成"可復(fù)用"的"解決方案",就可以將其從支撐子域簡(jiǎn)化為通用子域,降低成本和風(fēng)險(xiǎn) 。

不就是個(gè)短信驗(yàn)證嘛,有這么復(fù)雜嗎?

前幾天安全專家馬偉發(fā)布了《不就是個(gè)短信登錄API嘛,有這么復(fù)雜嗎?》,文章從“新增手機(jī)號(hào)和短信驗(yàn)證碼登錄”簡(jiǎn)單的一句話需求最終演變?yōu)楣适驴?274。

作為用戶,我可以通過(guò)手機(jī)號(hào)和短信驗(yàn)證碼登錄,以便于我更方便的登錄。

安全驗(yàn)收標(biāo)準(zhǔn):

  • 短信驗(yàn)證碼有效期2分鐘
  • 驗(yàn)證碼為6位純數(shù)字
  • 每個(gè)手機(jī)號(hào)60秒內(nèi)只能發(fā)送一次短信驗(yàn)證碼,且這一規(guī)則的校驗(yàn)必須在服務(wù)器端執(zhí)行
  • 同一個(gè)手機(jī)號(hào)在同一時(shí)間內(nèi)可以有多個(gè)有效的短信驗(yàn)證碼
  • 保存于服務(wù)器端的驗(yàn)證碼,至多可被使用3次(無(wú)論和請(qǐng)求中的驗(yàn)證碼是否匹配),隨后立即作廢,以防止暴力攻擊
  • 短信驗(yàn)證碼不可直接記錄到日志文件
  • 發(fā)送短信驗(yàn)證碼之前,先驗(yàn)證圖形驗(yàn)證碼是否正確(可選)
  • 集成第三方API做登錄保護(hù)(可選)

實(shí)際上,根據(jù)我的經(jīng)驗(yàn),還可以再加一些驗(yàn)收條件

  • 應(yīng)該可以通過(guò)配置白名單的方式,只向特定手機(jī)號(hào)碼發(fā)送驗(yàn)證碼,以免在非生產(chǎn)環(huán)境測(cè)試時(shí)發(fā)生打擾真實(shí)用戶的事故
  • 應(yīng)該可以通過(guò)配置By Pass的方式,在特定環(huán)境禁用短信驗(yàn)證碼發(fā)送,并總是驗(yàn)證通過(guò),以便在非生產(chǎn)環(huán)境節(jié)約短信配額

一個(gè)小小的需求可以衍生出如此之多的驗(yàn)收條件,而且其中不少是非功能性的(不容易識(shí)別的、不容易實(shí)現(xiàn)的),以至于有同學(xué)感嘆:

厲害,短信驗(yàn)證這個(gè)事,如果有人做成整套解決方案直接調(diào)用就好了,就像keycloak一樣。

運(yùn)用子域進(jìn)行戰(zhàn)略設(shè)計(jì)

那么短信驗(yàn)證是否能成為"整套解決方案"呢,我們可以使用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中子域分類的框架來(lái)分析:

  • 核心子域:它是一個(gè)唯一的、定義明確的領(lǐng)域模型,你要在這里進(jìn)行戰(zhàn)略投資,并在一個(gè)明確的限界上下文中投入大量資源去精心打磨通用語(yǔ)言。它是組織中最重要的項(xiàng)目,因?yàn)檫@將是你與其他競(jìng)爭(zhēng)者的區(qū)別所在。正是因?yàn)槟愕慕M織無(wú)法在所有領(lǐng)域都出類拔萃,所以你必須把核心域打造成組織的核心競(jìng)爭(zhēng)力。做出這樣的決定需要對(duì)核心域進(jìn)行深入地學(xué)習(xí)與理解,而這需要承諾、協(xié)作與試驗(yàn)。這是組織最需要在軟件中傾斜其投資的方向。
  • 支撐子域:這類建模方式提倡的是“定制開(kāi)發(fā)”,因?yàn)檎也坏浆F(xiàn)成的解決方案。你對(duì)它的投入無(wú)論如何也達(dá)不到與核心域相同的程度。你也許會(huì)考慮使用外包的方式實(shí)現(xiàn)此類限界上下文,以避免因錯(cuò)誤的認(rèn)為其具有戰(zhàn)略意義而進(jìn)行巨額的投資。這類軟件模型仍舊非常重要,核心域的成功離不開(kāi)它。
  • 通用子域:通用子域的解決方案可以采購(gòu)現(xiàn)成的,也可以采用外包的方式,亦或是由內(nèi)部團(tuán)隊(duì)實(shí)現(xiàn),但我們不用為其分配與核心域同樣優(yōu)質(zhì)的研發(fā)資源,甚至都不如支撐子域。請(qǐng)注意不要把通用子域誤認(rèn)為是核心域。你并不希望對(duì)其投資過(guò)甚。當(dāng)討論一個(gè)正在實(shí)施DDD的項(xiàng)目時(shí),我們最有可能討論的是核心域。

——《DDD精粹:運(yùn)用子域進(jìn)行戰(zhàn)略設(shè)計(jì)》Vaughn Vernon

可以發(fā)現(xiàn):

  • 核心子域是沒(méi)有必要或者說(shuō)不應(yīng)該嘗試開(kāi)發(fā)“可復(fù)用”的"整套解決方案"的,因?yàn)?可復(fù)用“、”整套解決方案“意味著高度的標(biāo)準(zhǔn)化,也就意味著可以以較低成本復(fù)制,就不可能成為核心競(jìng)爭(zhēng)力。
  • 通用子域應(yīng)該采用,而且往往也能找到“可復(fù)用”的"整套解決方案",以便降低成本和風(fēng)險(xiǎn)。
  • 支撐子域則顯得很"雞肋",由于沒(méi)有現(xiàn)成、成熟的解決方案,必須定制,但它又不是項(xiàng)目的核心價(jià)值。因此,如果能恰當(dāng)?shù)刈R(shí)別支撐子域的邊界,形成"可復(fù)用"的"解決方案",就可以將其從支撐子域簡(jiǎn)化為通用子域,進(jìn)一步降低成本和風(fēng)險(xiǎn)。

我認(rèn)為短信驗(yàn)證就是一個(gè)好例子,短信驗(yàn)證自身沒(méi)有獨(dú)立的價(jià)值,但沒(méi)有它,某些重要的功能會(huì)缺乏保護(hù)。但目前只能找到發(fā)送短信的SDK,而缺乏對(duì)于"發(fā)送-驗(yàn)證"這個(gè)相對(duì)標(biāo)準(zhǔn)化的問(wèn)題域的支持。

解決方案的形態(tài)是什么樣的

在微服務(wù)的大潮下,如果想要復(fù)用短信驗(yàn)證的能力,最先想到的是開(kāi)發(fā)一個(gè)短信驗(yàn)證服務(wù),開(kāi)放API給Consumer驗(yàn)證手機(jī)號(hào)碼或是短信登錄,名字我都想好了,叫sms-otp(OPT為one time password縮寫(xiě))。

(sms-otp 服務(wù))

如果我是甲方IT部門(mén),可能就這么做了,找到一個(gè)軟件集成商實(shí)現(xiàn)sms-otp就行了。

作為數(shù)字化轉(zhuǎn)型服務(wù)廠商,ThoughtWorks的想法會(huì)再進(jìn)一步,是否還有更通用的方法?

ThoughtWorks可能需要為很多客戶交付短信驗(yàn)證服務(wù),并且出于專業(yè)要求,我們并不會(huì)把為A客戶定制的代碼復(fù)制到B家使用,這時(shí)候一個(gè)開(kāi)箱即用的微服務(wù)是最佳選擇嗎?

如果還有其他的“通用”需求呢?例如支付寶支付、微信登錄呢,微服務(wù)的數(shù)量就開(kāi)始膨脹了。在一些項(xiàng)目中,部分客戶的IT基礎(chǔ)設(shè)施比較滯后,這類項(xiàng)目未必適合以微服務(wù)啟動(dòng)。那有沒(méi)有更靈活的方案,既可以在單體應(yīng)用中開(kāi)箱即用,又可以按需擴(kuò)展為獨(dú)立服務(wù)呢?

如果存在不確定性,不妨做個(gè)MVP

提到開(kāi)箱即用,近幾年在Java業(yè)界最火的就是Spring Boot了,Auto Configuration大大提高了新應(yīng)用搭建的速度,在需要定制時(shí)又不失靈活性。我覺(jué)得這是把好錘子,來(lái)敲兩下看看是不是找對(duì)了釘子?

我們針對(duì)短信驗(yàn)證推出了自定義的 Spring Boot Starter,大名。

通過(guò)starter,既可以將解決方案"嵌入"單體應(yīng)用,也可以快速啟動(dòng)新的微服務(wù)。

以下是一個(gè)簡(jiǎn)單的接入示例,為項(xiàng)目添加Starter:

 
 
 
 
  1. compile group: "com.github.hippoom:sms-verification-starter:${latestVersion}" 
  2. # 如果需要使用開(kāi)箱即用的Redis驗(yàn)證碼存儲(chǔ) 
  3. compile "org.springframework.data:spring-data-redis:2.1.2.RELEASE" 
  4. # 如果需要使用開(kāi)箱即用的Aliyun短信服務(wù) 
  5. compile("com.aliyun:aliyun-java-sdk-core:4.0.6") 
  6. compile("com.aliyun:aliyun-java-sdk-dysmsapi:1.1.0") 

為應(yīng)用注入配置項(xiàng):

 
 
 
 
  1. # application-{profile}.properties 
  2. # 如果使用開(kāi)箱即用的Aliyun短信服務(wù) 
  3. daming.sms.provider=aliyun 
  4. daming.aliyun.accessKeyId={your key id} 
  5. daming.aliyun.accessKeySecret={your key secret} 
  6. daming.aliyun.sms.signature={your text} # 阿里云短信服務(wù)的簽名,可以在控制臺(tái)找到,如是中文,請(qǐng)轉(zhuǎn)為Unicode 
  7. daming.aliyun.sms.templateCode={your code} #阿里云短信服務(wù)的模板Code,可以在控制臺(tái)找到 
  8.  
  9. # 設(shè)置私鑰地址,此私鑰會(huì)用來(lái)簽名被驗(yàn)證過(guò)的手機(jī)號(hào)碼 
  10. daming.jwt.privateKeyFileLocation=/home/your-app/sms-verification-private.der 

啟動(dòng)應(yīng)用,并請(qǐng)求驗(yàn)證碼:

 
 
 
 
  1. >curl -H 'Content-Type: 
  2.  application/json' 
  3. -XPOST ${host}:${port}/api/sms/verification/code 
  4. -d '{"mobile": "${your mobile}"}' 

在收到驗(yàn)證短信后,嘗試驗(yàn)證:

 
 
 
 
  1. >curl -H 'Content-Type: application/json' -XDELETE ${host}:${port}/api/sms/verification/code -d '{"mobile": "${your mobile}","code":"${the code}"}' 
  2. {"token":"{a very long string}"}% 

在Response中可以得到一個(gè)JWT,前端應(yīng)用將該JWT提交給Consumer應(yīng)用,Consumer應(yīng)用使用私鑰對(duì)應(yīng)的公鑰即可驗(yàn)證該手機(jī)號(hào)碼實(shí)現(xiàn)業(yè)務(wù)目標(biāo)(如登錄或保存驗(yàn)證過(guò)的手機(jī)號(hào)碼)。

一些自問(wèn)自答

如果是Starter的話,如何靈活定制呢?

既然這些Starter都是解決支撐/通用子域的問(wèn)題,那么其領(lǐng)域規(guī)則、業(yè)務(wù)流程是比較固定、不易變化的。需要靈活定制的部分其實(shí)是技術(shù)實(shí)現(xiàn),使用端口和適配器架構(gòu)可以將這兩部分隔離開(kāi),使用適配器擴(kuò)展/變更技術(shù)解決方案。舉個(gè)例子:

大名的端口和適配器架構(gòu)

各個(gè)出口端口(右側(cè)橙色板塊的Port)作為擴(kuò)展點(diǎn),定制的Driven Adapter通過(guò)Spring注入。

為什么要綁定技術(shù)棧?非Java技術(shù)棧怎么辦?

可以使用該Starter快速搭建一個(gè)微服務(wù)。。。

有沒(méi)有前端的開(kāi)箱即用方案 ?

還沒(méi)有,我不是前端專家,但我猜測(cè)前端的開(kāi)箱即用方案可以做成類似于 Ant Design 或 Element UI 但更專用的組件?

總結(jié)

  • 支撐子域是為了項(xiàng)目成功必須要處理的問(wèn)題,但由于沒(méi)有現(xiàn)成、成熟的解決方案,它必須定制,費(fèi)時(shí)費(fèi)力
  • 如果能恰當(dāng)?shù)刈R(shí)別支撐子域的邊界,形成"可復(fù)用"的"解決方案",就可以將其從支撐子域簡(jiǎn)化為通用子域,降低成本和風(fēng)險(xiǎn)
  • 短信驗(yàn)證是從支撐子域簡(jiǎn)化為通用子域的好例子,Project Daming(中文為大名),是我們推出的短信驗(yàn)證的解決方案,它的目標(biāo)是將短信驗(yàn)證從支撐域簡(jiǎn)化為通用域,它以自定義的 spring boot starter出現(xiàn),可以幫助團(tuán)隊(duì)在單體應(yīng)用中快速嵌入短信驗(yàn)證功能,也可以快速啟動(dòng)一個(gè)短信驗(yàn)證的微服務(wù)

網(wǎng)頁(yè)名稱:不就是個(gè)短信驗(yàn)證嘛,還真挺復(fù)雜的
瀏覽地址:http://www.5511xx.com/article/cdeeeeo.html