整體思路html
這個涉及到兩個方面問題:
一個是接口訪問認證問題,主要解決誰可使用接口(用戶登陸驗證、來路驗證)
一個是數據數據傳輸安全,主要解決接口數據被監聽(HTTPS安全傳輸、敏感內容加密、數字簽名)web
用戶身份驗證:Token與Session
開放接口Api服務其實就是客戶端與服務端無狀態交互的一種形式,這有點相似REST(Representational State Transfer)風格。
普通網站應用通常使用session進行登陸用戶信息的存儲和驗證(有狀態),而開放接口服務/REST資源請求則使用Token進行登陸用戶信息的驗證(無狀態)。Token更像是一個精簡版的session。Session主要用於保持會話信息,會在客戶端保存一份cookie來保持用戶會話有效性,而Token則只用於登陸用戶的身份鑑權。因此在移動端使用Token會比使用Session更加簡易而且有更高的安全性,同時也更加符合RESTful中無狀態的定義。redis
Token交互流程
客戶端經過登陸請求提交用戶名和密碼,服務端驗證經過後生成一個Token與該用戶進行關聯,並將Token返回給客戶端。
客戶端在接下來的請求中都會攜帶Token,服務端經過解析Token檢查登陸狀態。
當用戶退出登陸、其餘終端登陸同一帳號、長時間未進行操做時Token會失效,這時用戶須要從新登陸。數據庫
Token生成原理
服務端生成的Token通常爲隨機的非重複字符串,根據應用對安全性的不一樣要求,會將其添加時間戳(經過時間判斷Token是否被盜用)或url簽名(經過請求地址判斷Token是否被盜用)後加密進行傳輸。通常Token內容包含有:用戶名/appid,密碼/appsecret, 受權url,用戶自定義token(用戶自定義簽名),時間戳,有效期時長(秒), 系統簽名(sign)等。api
Api接口服務調用流程:
1. 首先要獲取全局惟一的接口調用憑據(access_token)。該過程務必使用https安全傳輸協議,不然被攔截監聽了,用戶名和密碼等重要數據就都泄漏了。
具體過程:
a. 客戶端向服務端經過https協議發送請求,參數包含用戶名、密碼、請求類型等
b. 服務端接到請求後,驗證用戶信息是否正確,若是正確,返回access_token和expires。不然返回errorcode和errmsg。
c. 服務端access_token能夠存儲在session或者redis等內存數據庫中,鍵名(key)爲user_id,鍵值爲access_token。
d. 客戶端得到access_token後,保存到file或redis等內存數據庫中。不推薦保存到session或數據庫中,保存到session數據容易丟失,保存到數據庫由於涉及IO讀寫,性能較低。
2. 經過RESTful風格的資源請求格式調用接口,如:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
正常狀況下,服務端會返回JSON數據包給調用者,成功則返回包含業務數據內容的JSON數據包,失敗則返回包含errcode和errmsg的JSON數據包安全
對於敏感的api接口,需使用https協議
http叫超文本傳輸協議,使用TCP端口80,默認狀況下數據是明文傳送的,數據能夠經過抓包工具捕獲到,所以在interner上,有些比較重要的站點的http服務器須要使用PKI(公鑰基礎結構)技術來對數據加密!這也就是https了;
https叫安全的超文本傳輸協議,使用TCP端口443,他的數據會用PKI中的公鑰進行加密,這樣抓包工具捕獲到的數據包也沒有辦法看包中的內容,由於他沒有密鑰,固然篡改也就沒有什麼意義了,安全性大大提升,要解密數據的話就要用到PKI中的私鑰。因此一些安全性比較高的網站如:網上銀行,電子商務網站都須要用https訪問! 服務器
微信access_token設計的原理解析
1. appid:接口身份證號。
2. appsecret:密碼。
3. access_token:公衆號的全局惟一接口調用憑據,,公衆號調用各接口時都需使用access_token。access_token是加密的字符串,其目的是爲了接口安全考慮,否則隨便就能調用微信服務器的接口會有很大風險。access_token包含的信息有appid, secret, 用戶自定義token,受權url,有效時長等。(登錄後的憑據,證實你已經登錄,至關於你拿着票去看演唱會,說明你已經買票了,纔會讓你進)。
4. expires_in:access_token過時時間,由於這裏是第三方服務器調用,因此微信服務器必須返回告知給第三方服務器過時時間,從而讓第三方服務器更好處理。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將致使上次獲取的access_token失效。
5. openid:爲了識別用戶,每一個用戶針對每一個公衆號會產生一個安全的OpenID,OpenID是使用用戶微信號加密後的結果,每一個用戶對每一個公衆號有一個惟一的OpenID,開發者可經過OpenID來獲取用戶基本信息。
6. unionid:用來區分用戶的惟一性,由於只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號,用戶的UnionID是惟一的。換句話說,同一用戶,對同一個微信開放平臺賬號下的不一樣應用,UnionID是相同的。微信
接口調用請求說明
https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回說明
正常狀況下,微信會返回下述JSON數據包給公衆號:
{"access_token":"ACCESS_TOKEN","expires_in":7200} (access_token的存儲至少要保留512個字符空間,expires_in單位是秒,有效期目前爲2個小時,即7200秒)
錯誤時微信會返回錯誤碼等信息,JSON數據包示例以下(該示例爲AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}cookie
參考文章:
https://www.zhihu.com/question/20863625
http://blog.csdn.net/gebitan505/article/details/39178035
http://www.tuicool.com/articles/jQJV3i
http://www.oschina.net/question/1433358_233412
http://www.lai18.com/content/944366.html
http://blog.csdn.net/gebitan505/article/details/39178917
http://blog.csdn.net/gebitan505/article/details/51614805
http://www.szweb.cn/Knowledge/5714.htmlsession
版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請註明做者及出處。 |