摘要:微信提供了作為識別用戶身份的憑證,可以結(jié)合設(shè)計一套用戶身份權(quán)限認證機制。認證免疫跨站請求偽造,而認證則存在遭受的可能性。此處的是引導(dǎo)用戶進入授權(quán)頁面后微信服務(wù)器附加上去的,詳細方法見微信公眾平臺的微信授權(quán)網(wǎng)頁文檔。
項目背景
最近在開發(fā)一個微信公眾號商城,在調(diào)用下單、支付、查詢訂單等等接口時,需要驗證用戶的身份。微信提供了openid作為識別用戶身份的憑證,可以結(jié)合openid設(shè)計一套用戶身份權(quán)限認證機制。考慮到安全性和易實現(xiàn)程度,備選的方案有Session認證機制和Token認證機制,本文在比較了兩者的特點后選擇了Token認證機制,然后詳細闡述了如何實現(xiàn)Token認證機制。
接口設(shè)計在尋找合適的認證方式之前,先說明一下項目前后端的設(shè)計。項目的前后端是分離的,前端使用AJAX的方式向后端請求操作資源(增、刪、改);后端接口設(shè)計遵循RESTful API原則,結(jié)果以JSON格式返回。
身份認證備選方案 Session認證在web網(wǎng)站中,session可以將訪客狀態(tài)記錄在服務(wù)器中,并分配一個唯一的session id給訪客,并將該id附加在headers中返回給客戶端??蛻舳私邮盏絪ession id后,會將id存儲在cookie,之后客戶端每次訪問服務(wù)器,傳送的cookie中都會攜帶session id,服務(wù)器以此來識別訪客的身份。
token認證方式中客戶端和服務(wù)器的交互過程與session的類似,客戶端向服務(wù)端請求token,拿到token后,客戶端可以在之后的請求中將token附加在header,以驗證用戶的身份和權(quán)限。
【此處應(yīng)該列舉諸多不同,但是一定要提到為什么token更適合,而不是session】
token認證更靈活。對于session認證,客戶端每次發(fā)送求情都會發(fā)送cookie;而對于token認證,可以在需要身份驗證的場景下才發(fā)送token。
token允許多域名認證。cookie是綁定單域名的,在a域名生成的cookie無法用于b域名,所以session id無法作為不同域名的共同認證id。而token認證則不受限制,token可以附加在任何請求上。
在客戶端的存儲方式不同。session自動存儲在cookie,而token則需要定義存儲的方式。token通常可以存儲在localStorage(永久存儲,瀏覽器關(guān)閉時不清除token)、sessionStorage(瀏覽器關(guān)閉時token會被清除)、cookie。值得一提的是,即使將token存儲在cookie,也可以免疫CSRF,因為cookie中的token并不用于認證。
CSRF(跨站請求偽造)。認證免疫CSRF(跨站請求偽造),而session認證則存在遭受CSRF的可能性。
跨站腳本攻擊(XSS)。相對于session認證,token認證更容易遭受跨站腳本攻擊(XSS)。
本項目考慮到Token認證機制更靈活,例如token可以控制是否附加在請求、token本身可以進行自定義加密、可以將token存儲在cookie以外的地方,所以選定Token認證機制作為商城應(yīng)用的用戶身份權(quán)限認證機制。
獲取token的流程客戶端向服務(wù)端token接口提交code,請求獲取token。此處的code是引導(dǎo)用戶進入授權(quán)頁面后微信服務(wù)器附加上去的,詳細方法見微信公眾平臺的微信授權(quán)網(wǎng)頁文檔。
服務(wù)端通過code向微信公眾平臺換取用戶的openid。微信授權(quán)網(wǎng)頁有兩種授權(quán)scope,本項目只需要用戶的openid,不需要用戶更多的信息,所以將scope設(shè)為snsapi_base。
微信公眾平臺向服務(wù)端返回了openid等等信息。
服務(wù)端生成token,將token和用戶信息以鍵值對的形式存儲后,服務(wù)端返回token給客戶端。
存儲token及用戶信息的流程服務(wù)端獲取用戶的openid后,在數(shù)據(jù)庫中登記用戶的信息,并取出用戶的id。
服務(wù)端以token為key,以openid、user id、權(quán)限信息等為value,將該鍵值對存入緩存中。在存入緩存時,注意設(shè)置緩存有效時間,過長的有效期存在安全隱患,對于本項目,用戶辦理業(yè)務(wù)后短時間內(nèi)不會再訪問,所以將token的有效期設(shè)置為2小時。
調(diào)用接口時的token認證流程客戶端將token附加在header,向業(yè)務(wù)接口發(fā)送請求。
業(yè)務(wù)接口在執(zhí)行業(yè)務(wù)邏輯前,憑token驗證用戶的身份。分別驗證以下三點:
token的合法性(有記錄)
token的有效性(沒過期)
Token對應(yīng)的用戶權(quán)限Auth
總結(jié) Token機制的特點使用靈活,可以選擇性認證。
可以多個域名使用同一token認證體系。
在客戶端的存儲靈活,除了存儲在cookie,還可以選擇localStorage、sessionStorage。
免疫CSRF(跨站請求偽造)。
Token認證機制的三個流程獲取Token的流程。
存儲Token及身份權(quán)限信息的流程。
調(diào)用接口時的Token認證流程。特別注意需要驗證token的合法性、時效性、關(guān)聯(lián)的用戶權(quán)限。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28329.html
摘要:本文是淺析微信支付系列文章的第三篇,主要會講一下在開發(fā)前的一些注意事項。淺析微信支付系列已經(jīng)更新兩篇了喲,沒有看過的朋友們可以看一下。開通微信支付需要注冊登陸微信商戶平臺,微信支付相關(guān)的信息都需要在這個平臺上進行操作。 本文是【淺析微信支付】系列文章的第三篇,主要會講一下在開發(fā)前的一些注意事項。 淺析微信支付系列已經(jīng)更新兩篇了喲~,沒有看過的朋友們可以看一下。 淺析微信支付:前篇大綱...
摘要:時間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。第六章公眾號與開發(fā)平臺關(guān)聯(lián)公眾號與開放平臺關(guān)聯(lián)情景說明當使用端進行微信授權(quán)登錄時,得到的和公眾號授權(quán)登錄時得到的不一樣。 時間:2017年08月12日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹...
摘要:注冊測試號注冊的地址在這里要進行微信公眾號的開發(fā),那就需要一個本地的開發(fā)環(huán)境來進行開發(fā)。而微信測試號就正好提供了這樣的一個環(huán)境。通俗一點理解微信要知道訪問它資源是不是這個當前測試號。 注冊測試號 注冊的地址在 這里 要進行微信公眾號的開發(fā),那就需要一個本地的開發(fā)環(huán)境來進行開發(fā)。而微信測試號就正好提供了這樣的一個development環(huán)境。每個微信號只能對應(yīng)一個測試號,但是每個測試號可以...
摘要:自建網(wǎng)站對接微信公眾號微信公眾號技術(shù)平常我們有些寫各種網(wǎng)站個人博客系統(tǒng)物流管理系統(tǒng)通信錄管理系統(tǒng)校園二手網(wǎng)站我們都知道只需要租用一個服務(wù)器再配置一個備案好的域名就可以在瀏覽器上進行訪問了不知大家不知大家有沒有想過將你搭的網(wǎng)站對接微信公眾 title: 自建網(wǎng)站對接微信公眾號date: 2018-04-12 15:25tags: 微信公眾號, PHP codeigniter cat...
閱讀 1010·2023-04-25 19:35
閱讀 2672·2021-11-22 09:34
閱讀 3702·2021-10-09 09:44
閱讀 1729·2021-09-22 15:25
閱讀 2944·2019-08-29 14:00
閱讀 3378·2019-08-29 11:01
閱讀 2606·2019-08-26 13:26
閱讀 1741·2019-08-23 18:08