1. 程式人生 > >程式設計師過關斬將--要想獲取我的使用者資訊,就得按照規矩來

程式設計師過關斬將--要想獲取我的使用者資訊,就得按照規矩來

菜菜君,我又來啦

又有什麼事嗎?

我按照你上篇文章寫的JWT的方式已經把網站認證寫完了,而且效果還不錯

那恭喜你呀,下次面試又多了一項技能

不過,現在又有一個問題,我做的系統有一個合作商想要利用我們的使用者資訊登入他們的系統

你還要做授權呀?

是呀,我的思路是讓使用者在第三方系統的輸入賬號密碼,然後第三方的服務端請求我們伺服器來驗證正確性

這樣做真的好嗎?

這樣做我們的系統改動很小呀,我覺得很好呀

這樣做有很多弊端呀,且聽我給你講個小故事

以下業務場景只針對於Web系統,而且Web頁面有後臺服務程式的場景。


開端

那一年,我所在公司的使用者量達到了公司成立以來的新高峰,經過多個程式設計師日日夜夜加班,每個業務系統達到了幾乎四個9的穩定性,同時業務在業界也有了一定的知名度。那一天突然有一個合作商登門拜訪,提出合作共贏的意向。業務的場景就是我們的系統使用者能夠在他們系統登入,並能夠獲取使用者一定的資訊以便進行一些業務操作。


他們希望我們能夠把已存在的使用者資料Copy一份匯入他們的系統,並且新註冊的使用者進行單項同步更新。這不是蝦扯蛋嗎?.....

為什麼不可行

為了實現使用者資訊互通而達到業務要求,其實方案有很多。如果不是底線情況下,同步使用者資訊這種方案就是一個外行人,一個扯淡的方案。為什麼這麼說?首先說資訊同步這種方式,如果是單項同步,雙方所有相關人員的工作量已經非常之大,一定條件下單項同步升級為雙向資訊同步,雙方的程式設計人員將會苦不堪言。


另外撇開工作量,使用者的資訊本質上屬於使用者的私密資訊,一個使用者能夠把自己的隱私放心的儲存在你這裡,就說明了對公司的信任度。一旦發生使用者資訊複製的操作,本質上是對使用者的不負責任,道德上,法律上都有所欠缺。

解決方案

作為一個技術人員,排除不合理方案,提供在業務可行情況下的技術方案是職責所在,那有沒有不用複製使用者資訊這麼low B的方案呢?假設我們所在公司的系統為A,業務的域名為www.A.com,第三方系統為B,業務域名為www.B.com

記住我們的最終業務目標:允許我們公司的使用者(A系統)在第三方系統(B系統)能夠登入,並且能夠獲取使用者一些相關的資訊。極限業務情況下,在A系統使用者修改了相關資訊,並且同步到B系統。

解決方案1

在第三方系統登入的入口,允許我方使用者輸入賬號密碼,然後第三方系統(客戶端或者服務端都可以)攜帶使用者輸入的賬號密碼請求我司登入伺服器,如果驗證通過則返回使用者相關資訊,第三方系統接收到返回資料,按照自己相關的登入流程進行登入,並且可以儲存使用者相關的資訊。請求的形式和大體的流程如下圖所示

http://www.A.com/login?loginname=caicai&pwd=buzhidao

說實話,我並不推薦這種方案,雖然它比直接複製使用者資訊要好一些,但是依然問題很大,使用者在無形中已經把賬號密碼或者其他登入憑證洩露給並不信任的第三方系統中,而這可能並非使用者想要的結果。

解決方案2

以上方案有一個致命的缺點,那就是登入頁面是使用者並不信任的第三方頁面,如果能避免這樣的危險,讓使用者在信任的我方登入,會大大增強使用者的信任度。技術方面在我方實現登入實在是容易,唯一需要考慮的是使用者登入成功之後如何把使用者資訊傳送給第三方系統。如果採用請求呼叫的方式(比如:登入成功,我方呼叫第三方一個介面),技術上可以實現,但是下次再來一個第三方申請這樣的業務,我方的呼叫介面可能會需要修改,所以現在業界比較好的也比較通用的方式是通過地址的跳轉來實現。具體流程如下:

1. 使用者在第三方點選登入,跳轉到我方提供的登入頁面,頁面URL中帶有登入成功跳轉的頁面地址,並在此頁面輸入賬號密碼。

2. 我方根據使用者賬號密碼判斷使用者正確性,登陸成功,獲取使用者資訊。

3. 然後跳轉到第三方提供的登入成功跳轉頁面,並把使用者資訊攜帶過去。

4. 第三方跳轉頁面接收到使用者資訊,處理剩餘業務,流程結束。

第一步中第三方跳轉到我方的登入頁面URL如下所示:

http://www.A.com/login?type=userinfo&redirecturi=http://www.B.com/callback

解決方案3

方案2中登入部分已經和方案1有了本質的區別,雖然僅僅是一個登入方的改變,安全性以及對使用者隱私的保護上卻有著大大的提升。但是流程中卻依然存在著主動傳輸使用者資訊,如果有人劫持的話,還是有使用者資訊洩露的風險。如何避免這樣的風險呢?


試想,能否利用其它憑據來代替使用者資訊呢?當然是可以,這也是現代Web系統實現授權的普遍方式。使用者資訊取而代之的是一個令牌,而且這個令牌有一定的時效性,只能維持一段時間內有效,這在一定程度上保護了系統資料。第三方系統獲取到這個令牌之後,每次獲取使用者資訊都會攜帶者這個令牌作為憑證,我方的系統同時也只認可這個令牌作為授權的憑證。

http://www.A.com/login?type=token&redirecturi=http://www.B.com/callback


這裡我要順便說一下,令牌的下發是通過前端(瀏覽器)的跳轉傳輸給第三方系統,然後第三方系統的前端傳輸給後端,然後第三方的後端攜帶令牌獲取使用者資訊,要注意哦,如果是第三方前端頁面攜帶令牌去獲取使用者資訊,毫無安全性而言。

方案4

方案3其實在很多時候已經足夠了,但是有一點需要注意,每個令牌有一定的有效時間,這是設計上的優勢,同時也意味著令牌如果被其他人獲取到,一樣可以竊取使用者資訊,由於在方案3中令牌的下發實際上還是通過前端(瀏覽器)來傳輸的,凡是在前端傳輸的情況下,就會有洩露的風險,那有沒有辦法避免在前端傳輸呢?

這裡需要提醒一點,要想實現我方使用者可以登入第三方系統,並且在保護使用者隱私的情況下,在我方登入是必須的。而且我方系統必須頒發給第三方系統一個憑證才能達到第三方獲取我方使用者的要求。

既然傳輸憑證不可避免,於是人們便想到了可以在前端(瀏覽器)傳輸一個只有一次有效的憑證,然後第三方後端依據這個憑證去獲取令牌,因為服務端的通訊要比前端(瀏覽器)的通訊要安全的多。於是方案4應運而生:

1. 使用者跳轉到我方登入頁面進行登入。

2. 我方驗證使用者使用者名稱密碼無誤,產生一個有效次數為1並且一定時間內有效的code,並攜帶著這個code跳轉到第三方的回撥頁面

3. 第三方回撥頁面,收到code引數,傳輸給後端程式。

4. 第三方後端程式收到code引數,攜帶著code呼叫我方介面

5. 我方驗證code有效性,如果有效則返回令牌資訊

6. 第三方收到令牌資訊,攜帶令牌資訊呼叫我方介面獲取使用者資訊

7. 我方驗證token有效性,如果有效則返回使用者資訊

8. 之後的每次呼叫都攜帶者token進行訪問,code就算被人獲取到已經不起作用

http://www.A.com/login?type=code&redirecturi=http://www.B.com/callback

升級

方案4雖然看上去已經足夠好,但是並非完美。

1. 當第三方跳轉到我方登入頁面的時候,我方並不知道這個第三方是誰,是不是可信任的,所以有必要讓我方識別這個第三方是否可以信任。我方在授權第三方的時候可以給每一個第三方頒發一個類似於appid和appkey的資料,appid用來標識每一個我方授權的第三方,而且每一個appid必須註冊進行回撥的url。這樣當第三方跳轉到我方登入頁面的時候,我方就可以識別出來這個第三方以及回撥跳轉的url是否有效。

2. 當第三方攜帶者code去換取token,以及之後攜帶token去獲取使用者資訊的每次通訊,都應該按照我方規則利用appid和appkey進行簽名處理,這樣我方的伺服器端也能夠識別出來呼叫方是否是可信任的。

3. 在使用者登入授權的頁面,使用者可勾選自己授權給第三方的資料內容,這些許可權將作用於code以及令牌中。

4. 由於每個令牌都有失效時間,如何更新令牌則會是一個技術點,其實完全可以在下發令牌的同時也下發一個用於更新令牌的令牌,這個令牌隨著每次重新下發令牌而更新。

5. 我方使用者的資訊每次更新的時候,可以把相關的令牌失效,以達到讓第三方重新獲取使用者資訊而同步的效果

6. 我方登入頁面以及供第三方呼叫的所有介面都應該採用https協議,並要求所有的第三方回撥頁面必須也全部採用https,這能有效的仿製惡性劫持。

不知道菜菜把不清楚author2.0 授權的同學教會了沒有,如果還不清楚,請私信菜菜 

相關推薦

程式設計師過關斬將--獲取的使用者資訊按照規矩

菜菜君,我又來啦 又有什麼事嗎? 我按照你上篇文章寫的JWT的方式已經把網站認證寫完了,而且效果還不錯 那恭喜你呀,下次面試又多了一項技能 不過,現在又有一個問題,我做的系統有一個合作商想要利用我們的使用者資訊登入他們的系統 你還要做授權呀? 是

學知識你必須先有強烈的求知欲望像你有強烈的求生欲望一樣

ren value ext encoding true config -c 求知欲 servle 1. web.xml中配置了CharacterEncodingFilter,配置這個是攔截所有的資源並設置好編號格式。   encoding設置成utf-8就相當於reque

程式設計師開發遊戲只為向女友求婚每個關卡都是淚點!是一個普通人但是成為你另一半玩家

為了向心中的女神求婚,每個男生都會挖空心思地想出一些非常特別的創意。 例如這位網名叫做 LA pike 的程式設計師,他為了向交往已久的女友求婚,利用自己的專長,寫出了一個以兩人的回憶為主題的闖關遊戲。 他假裝邀請女友來玩遊戲,於是女友便在不知情的狀況下,開始了闖關遊戲。 第一關

一位女程式設計師的內心獨白:幹了

過去的那幾年裡我鬧著哭著要做一名程式設計師,在每個人都會經歷的努力下,我終於做到了,其實那個時候我並沒有多少驚喜,因為我是付出了極大的代價的,在那之前我主要在搞網頁設計,做得不錯,可是我一心想著做程式設計師,和原來的工作職務發生了不少衝突,但是還是義無返顧地脫離了原來的設計行

黑馬程式設計師:你的UI學習路線圖咯!

相信很多想入門深度學習的朋友都會遇到這個問題,就是應該看哪些視訊、讀哪些文章、找哪些人交流。包括我自己,也是花費了大量的時間在尋找資源上。也曾苦惱視訊資源套路太多,苦惱視訊資源為什麼那麼零散,苦惱自學或者提升自己的道路太過孤獨、無人交流。 對於以上陳述的問題,我花費

程式設計師修神之路--做好微服務架構並非易事!

菜菜哥,上次聽你講了微服務和SOA,明白了很多道理 看來面試用上了吧 呵呵,但是面試官問我微服務有什麼優點和缺點... 看來還得給你詳細講一講微服務 概念 微服務(Microservices Architecture)是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可

程式設計師過關斬將--作為一個架構師是不是應該有很多職責?

>每一個程式設計師都有一個架構夢。 上面其實本質上是一句富有事實哲理的廢話,要不然也不會有這麼多人關注你的公眾號。這些年隨著“企業數字化”轉型的口號,一大批企業奔跑在轉型的路上,希望領先一步對手將企業IT部門從單純的成本中心轉變為業務驅動者,而這個過程中,企業的架構師起著舉足輕重的作用。架構師的工作在很多擼

所有程式設計師注意往後工作會越來越難找

最近傳的轟轟烈烈的裁員潮,想必大家都有耳聞了,各個公司縮排開支,不但減少人員招收,而且還裁員,這無疑給我們程式設計師在敲著一個警鐘,網際網路的寒冬真的來了 各大公司停招 1、阿里收縮招聘需求 2、京東全面停止社招!    3、華為也停止普通社招

程式設計師地鐵上寫程式碼被網友抓拍程式設計師這逼裝的6不6?

一提起程式設計師,很多人就會聯想到寫程式碼。有業內人士戲言,程式設計師忙起來,不分場合,不分時間地點,拿起電腦就開始寫程式碼,這才是真正的程式設計師風範。這不,一名在地鐵上寫程式碼的程式設計師小哥就被網友抓拍並將其照片釋出到了網路上,引起了圍觀網友的討論與熱議。 從圖片上看,這名程式設計師

“備孕期”的Java程式設計師一定學會抽象

我相信,看到標題後的你一定很好奇,究竟什麼樣的Java程式設計師算是在“備孕期”呢?在我看來,“備孕期”主要指那些初入Java程式設計的新人,他們正下足功夫準備,以求在10個月後以高薪的姿態進入一家軟體公司——此時正是職業履歷的開端——比如說,簡歷上的自我介紹是:我從2018年10月24

JAVA程式設計師4年了迷茫了希望由前輩可以給指出一個技術路線5年左右程式設計師必須掌握的知識技能樹?

在程式界流行著一種預設的說法叫“黃金5年”,也就是一個程式設計師從入職的時候算起,前五年的選擇直接影響著整個職業生涯中的職業發展方向和薪資走向,如何走好這5年,徹底從一個剛入行的菜鳥蛻變成可以以不變應萬變的職業大牛,這是一個涉及到自身專業知識儲備和選擇的大難題,那麼,這五年裡,一個Java程式設計師

Java程式設計師月薪3K和月薪30K的區別為什麼只能找到月薪3K?

最近會有這些問題出現在各位程式設計師的眼中:“是不是Java程式設計師已經飽和了,為什麼我月薪3K而有些畢業出去就能拿到月薪3W?”今天我們拋開工作經驗,專案經驗,學歷背景,單從技術點分析,哪些方面判斷憑啥人家月薪30000,你月薪3000? 月薪3K的Java程式設計師 月薪3K的J

一個程式設計師的自白(無知之

有人說,父母亦老師,但父母並沒有告訴他人生是用來折騰而不是用來舒服的;有人告訴他,老師是啟蒙者,但老師並沒有告訴他,學無止境原來是跟自己的人性死磕到底。有人告訴他,自己才是人生的主導者,但那人並沒有告訴他,自己永遠無法知道自己不知道的事情。這些真相搞得他在自己面前顯得多麼地無知。

文藝程式設計師丨基於Python的詩和遠方有python也有詩!

  概述   學習Python中有不明白推薦加入交流群                 號:516107834          

#程式設計師因不加班被老員工懟:走早不像話!反問:你發工資給

在日常的工作中,我們難免會碰到“加班”這樣的事情,有時候是因為要趕專案進度,有時候是因為公司開會而耽誤了當天的工作時間,需要加班來完成當天的工作任務。所以說加班並不是我們的目的,真正的目的是想及時完成自己手中的工作任務。可是有些公司似乎喜歡員工加班,甚至還有不加班不像話這樣不成文的“規定”。 近

程式設計師:路人甲幫找到月薪3萬的工作

在剛結束的螞蟻金服ATEC小程式挑戰賽上,11歲的萬海妍作為現場最年輕的選手,最終以僅落後1秒鐘的成績獲得鼓勵獎。螞蟻金服董事長兼CEO井賢棟向她邀請:“支付寶的大門為你開啟,歡迎今後加入!”   很多人擠破腦袋想拿到的阿里offer,小姑娘不經意獲得。   程式

程式設計師必須掌握的十大經典演算法

演算法一:快速排序演算法 快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部迴圈(inner loop

一個野生程式設計師的真實自述:是如何從數學專業學渣入坑程式設計師

1、引言 “恭喜你,成功的避過了所有的正確答案,選擇了錯誤答案”。沒錯,我是一個數學專業的普通大學生(準確地說,是學渣一枚),排除萬難,我終於還是入了程式設計師的坑(不好意思,給程式設計師抹黑了)!   (本文同步釋出於:http:/

那些讓程式設計師崩潰又笑的程式命名...

本文旨在用最通俗的語言講述最枯燥的基本知識 1 到一家創業公司上班的第一天,老員工劉XX給我看了公司他負責的專案,奇怪的是,命名是“LiuQXProject”,劉XX看著驚愕的我說:“怎麼了?有什麼錯嗎?” 2 給同事做雙十一活動相關程式碼的review,學到到了很多中英混血單詞,獲取雙十一

所有 Python 程式設計師必須學會的「日誌」記錄。

本文字數:3840 字 閱讀本文大概需要:10 分鐘 寫在之前 在我們的現實生活中,「日誌記錄」其實是一件非常重要的事情,比如銀行的轉賬記錄,汽車的行車記錄儀記錄行駛過程中的一切,如果出現了什麼問題,我們可以通過「日誌記錄」來搞清楚到底發生了什麼事情。 除了在生活中,在日常的系統開發以及除錯等