摘要:對(duì)了,在這之前,首先要祝大家端午節(jié)快樂嘎嘎正文切入正題。其實(shí)在接入之前,我就有點(diǎn)范嘀咕,客戶端不會(huì)拿不到吧果然怕什么來什么,安卓那邊告訴我錯(cuò)誤,取不到值。和安卓那邊溝通,他們表示框架中可以模擬瀏覽器行為,實(shí)現(xiàn)的自動(dòng)發(fā)送。
寫在前面
時(shí)間:2017-05-29 7:30
距離上篇文章發(fā)布已經(jīng)一個(gè)多月了,本來自己的計(jì)劃是一周一記,怎么就變成月記了呢?最近工作的事情忙的焦頭爛額,當(dāng)然也不能排除我懶的要死的因素,有時(shí)間追擇天記怎么就不能寫篇博客呢?暗暗自責(zé)一分鐘...
今天是端午節(jié)小長假的第二天,第一天約好和舍友逛頤和園的計(jì)劃被帝都36度的高溫打回來了,于是乎這幫哥們又抱著手機(jī)開黑到深夜。昨天虛度了一天,今兒一早起來雄心滿滿的要繼續(xù)昨天的計(jì)劃,無奈這幾個(gè)老年人又不起床。我善心作祟,想著打擾人家美夢太不禮貌,那就,寫篇博客吧,理一理一個(gè)多月來亂七八糟的事情,要不然,月記也得成年記了。
對(duì)了,在這之前,首先要祝大家端午節(jié)快樂!嘎嘎
正文切入正題?;仡欉@一個(gè)多月亂七八糟的事情,其實(shí)就是一個(gè)傳統(tǒng)的PHP程序員,拿著一套沒有做用戶登錄狀態(tài)的App接口,在考慮如何利用session建立用戶會(huì)話,在接口服務(wù)端保存用戶信息和登錄狀態(tài)。
這里要吐槽一下ci框架,奇葩的重寫session機(jī)制,搞得我在postman中就是獲取不到session的值,浪費(fèi)不少時(shí)間。所以同志們,選擇框架要慎重啊!
我拿到的API接口,是沒有做任何請(qǐng)求驗(yàn)證的,就是任何人拿到接口地址就可以直接調(diào)用,這是極不安全的。我在考慮要做驗(yàn)證的時(shí)候,首先想到的就是傳統(tǒng)的cookie+session機(jī)制。但是一般的API又會(huì)在請(qǐng)求參數(shù)或者請(qǐng)求頭中加一個(gè)token。所以我的方案是:當(dāng)用戶登錄驗(yàn)證通過之后,在服務(wù)端session中保存用戶信息和一個(gè)與之匹配的token,然后將該token返回客戶端,表示登錄成功。接下來用戶的每一次請(qǐng)求操作,都需要將該token帶到請(qǐng)求頭中。
這樣做相當(dāng)于加了兩層驗(yàn)證。第一層就是session驗(yàn)證,傳統(tǒng)的web后臺(tái)驗(yàn)證方式。第二層是將請(qǐng)求頭中token與session中的token匹配,全部通過,才可以去跑接口中的邏輯。
安全性做到了,下面要接客戶端了。其實(shí)在接入之前,我就有點(diǎn)范嘀咕,客戶端不會(huì)拿不到session吧?果然怕什么來什么,安卓那邊告訴我session錯(cuò)誤,取不到值。
其實(shí)這很正常,web開發(fā)中session用起來簡單快速,那是因?yàn)闉g覽器幫我們做了很多事情。比如在session創(chuàng)建的時(shí)候,瀏覽器返回的響應(yīng)頭中會(huì)有Set-Cookie的選項(xiàng),幫我們?cè)跒g覽器本地創(chuàng)建cookie來保存上一步session創(chuàng)建時(shí)所生成的sessionid,然后下一次請(qǐng)求的時(shí)候又會(huì)在請(qǐng)求頭中帶上這個(gè)cookie,通過 cookie 中的 sessionid 找到對(duì)應(yīng)的session數(shù)據(jù)。就好比 session 是一張用戶表,cookie 中的 sessionid 就是用戶表的主鍵 id,瀏覽器獲取 session 數(shù)據(jù)的過程就好比是通過主鍵 ID 查找數(shù)據(jù)表的某條數(shù)據(jù)的過程。
但是在API中,雖然可以接收到響應(yīng)頭中的 set-cookie, 卻不會(huì)在下一次的請(qǐng)求頭中自動(dòng)添加 cookie。沒有發(fā)送sessionid,自然找不到 session 數(shù)據(jù)。所以在API中,發(fā)送請(qǐng)求頭中的cookie,需要我們手動(dòng)完成。
和安卓那邊溝通,他們表示框架中可以模擬瀏覽器行為,實(shí)現(xiàn) cookie 的自動(dòng)發(fā)送。但是這套接口不光給app用,pc網(wǎng)頁端也在用。如果要在 php curl 請(qǐng)求接口時(shí)手動(dòng)去找 cookie 并發(fā)送,無疑會(huì)增加接口的負(fù)重,而且麻煩的很。思慮再三,我們決定放棄這種驗(yàn)證方式。
我糾結(jié)的是,如果不用session,那么在調(diào)用獲取用戶信息接口的時(shí)候,至少要將user_id作為參數(shù)傳過去,但是session模式對(duì)于這種方式是不認(rèn)可的,因?yàn)橛脩粜畔⒁诘卿浿髲膕ession獲取,而不是通過客戶端直接傳遞,這會(huì)有風(fēng)險(xiǎn)。同時(shí)session最關(guān)鍵的還是保存用戶登錄狀態(tài),如果沒有session,如何知道當(dāng)前用戶是誰?是否在登錄狀態(tài)?是否登錄過期?
轉(zhuǎn)不過彎來,于是就去查百度,逛論壇,翻來覆去,最后發(fā)現(xiàn)一句話很關(guān)鍵:API是無狀態(tài)的。
對(duì),API是無狀態(tài)的,至少 restful 是這樣!
API無狀態(tài),開始不理解,可是它的合理性又在慢慢得到證實(shí)。如果api無狀態(tài),那么狀態(tài)只能是存在app客戶端。事實(shí)上確是如此,web中用戶狀態(tài)存在服務(wù)器,而app存在客戶端。
還有一種狀況,就是現(xiàn)在流行的前后端分離架構(gòu),用戶狀態(tài)又該存到哪?我記得之前看過相關(guān)的文章,解決方案是在前端與API之間加一個(gè) node 作為中間層。我一直不知道這層 node 是用來干嘛的,不過按照現(xiàn)在理解,這層 node 負(fù)責(zé)請(qǐng)求API,然后創(chuàng)建和維護(hù) session 會(huì)話。我就是按照這種方式去做,目前看來是可行的。
所以,扯了這么多,疑問滿滿,牢騷滿滿。如果你覺得web開發(fā)和api開發(fā)的區(qū)別就是前者渲染頁面,后者輸出數(shù)據(jù),那么 session 會(huì)是你繞不開的梗。session機(jī)制不是筆試題上表述session和cookie區(qū)別的答案那么弱智,你至少需要補(bǔ)充 http 的知識(shí),理解請(qǐng)求和響應(yīng)。
回到標(biāo)題,api下是否使用session?標(biāo)題的結(jié)尾是個(gè)問號(hào),所以自己考慮嘍。如果你沒有session情結(jié),或許,jwt是你更好的選擇。
本文由 楊成功 原創(chuàng),更多原創(chuàng)內(nèi)容請(qǐng)到專欄 楊成功的全棧之路
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23050.html
摘要:在我的機(jī)子上,運(yùn)行于端口,以避免和其他默認(rèn)運(yùn)行于端口的沖突。我們可以使用命令連接數(shù)據(jù)庫查看定義應(yīng)用層次創(chuàng)建的模板應(yīng)用有一個(gè)問題,客戶端和服務(wù)器段的代碼是一樣的。在中加入然后添加問題模板注意我們使用了來確保用戶未登錄的情況下應(yīng)用。 編者注:我們發(fā)現(xiàn)了有趣的一系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內(nèi)容。 到目前為止我們討論了Bower...
摘要:在我的機(jī)子上,運(yùn)行于端口,以避免和其他默認(rèn)運(yùn)行于端口的沖突。我們可以使用命令連接數(shù)據(jù)庫查看定義應(yīng)用層次創(chuàng)建的模板應(yīng)用有一個(gè)問題,客戶端和服務(wù)器段的代碼是一樣的。在中加入然后添加問題模板注意我們使用了來確保用戶未登錄的情況下應(yīng)用。 編者注:我們發(fā)現(xiàn)了有趣的一系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內(nèi)容。 到目前為止我們討論了Bower...
摘要:目標(biāo)是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認(rèn)的版本。不同類型的鍵值對(duì)分割符號(hào)分別是。這將會(huì)協(xié)商服務(wù)端和你安裝的支持的最高協(xié)議版本。 博客原文? HTTPie 是一個(gè)命令行 HTTP 客戶端。目標(biāo)是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個(gè)簡單的 http 命令,可以讓我們用簡單自然的表述發(fā)送任意 HTTP 請(qǐng)求,并且可以輸出帶代碼高亮的結(jié)果...
摘要:在發(fā)出經(jīng)過身份驗(yàn)證的請(qǐng)求時(shí),被認(rèn)為是端點(diǎn)的輸入,因此不會(huì)緩存響應(yīng)。自定義端點(diǎn)對(duì)或的操作通過使用或通過自動(dòng)公開。端點(diǎn)范圍請(qǐng)求范圍請(qǐng)求可以用于請(qǐng)求資源的一部分,當(dāng)使用或時(shí),操作將返回一個(gè)自動(dòng)支持范圍請(qǐng)求的。 50. 端點(diǎn) Actuator端點(diǎn)讓你監(jiān)視和與應(yīng)用程序交互,Spring Boot包含許多內(nèi)置的端點(diǎn),并允許你添加自己的端點(diǎn)。例如,health端點(diǎn)提供基本的應(yīng)用程序健康信息。 可以啟...
閱讀 2727·2021-10-12 10:12
閱讀 2345·2021-09-02 15:41
閱讀 2577·2019-08-30 15:55
閱讀 1411·2019-08-30 13:05
閱讀 2447·2019-08-29 11:21
閱讀 3543·2019-08-28 17:53
閱讀 3037·2019-08-26 13:39
閱讀 811·2019-08-26 11:50