在web中,使用Ajax呼叫API,怎麼做安全驗證,防止別的網站呼叫呢?
如果是APP呼叫要怎麼解決介面安全問題呢?還有API怎麼樣才能不暴露在公網上呢?只要的APP能調用,不都算暴露在公網上嗎?
在web中,使用Ajax呼叫API,怎麼做安全驗證,防止別的網站呼叫呢?
如果是APP呼叫要怎麼解決介面安全問題呢?還有API怎麼樣才能不暴露在公網上呢?只要的APP能調用,不都算暴露在公網上嗎?
ajax 跨域解決不了問題,跨域可以透過服務端模擬請求發送獲取ajax的資料
有兩種方法,但基本上類似,一種是請求頭,一種是頁面添加input token 但是這兩種方法前面主要的問題是要把token加密
比如token = md5(IP + 隨機數+ 時間戳+ UID + session_secret) 其實裡面的內容自己定義就好,主要是加密
將加密的內容放入session中 , session要設定過期時間
1、請求頭的話
加入access_token 請求頭, 在後台取得去請求頭的內容,然後跟session中的值比較, 如果爭取就證明沒問題,然後session就失效了。
2、跟請求頭類似,但是加密的值放到 input hidden 裡面, ajax提交的時候獲取這個值放到參數裡面
回答你後面的APP的問題
APP能存取肯定是要在公網上的,目前我們的安全方案是參數加密
比如說 要提交 a=1&n=2
那麼實際提交的時候要 對參數進行加密, mid=xxx&a=1&b=2&sign=md5(' mid=xxx&a=1&b=2'+密鑰)
mid表示一個客戶端呼叫介面的帳戶, 帳戶對應一個金鑰
伺服器端每次要檢驗提交的參數是否正確 也就是最後的sign這個參數
還有重要的一點就是客戶端的要是原生APP, 程式碼必須混淆加密,防止反編譯。然後這個密鑰的話定期更換,隨著版本更新更換密鑰
還有一個方法是在提交參數之前先將所有要提交的參數請求一個加密的地址這個地址會根據你的參數返回一個加密的token ,你帶著這個token 再提交實際的參數, 後端去進行驗證
這個方法的缺點就是要多進行一次網路請求,只適用於混合應用
這些也是我看其他部落格學習來的,也不知道淘寶,京東這樣的APP的介面是怎麼處理的
伺服器上沒有額外設定的話,ajax是無法跨網域呼叫你的api的,你也可以取得請求的網域來判斷一下
讓你授權的網站才能存取
可以在請求頭部加Access-Token
如果是介面性質的api調用,就不要暴露在公網上;如果是前端js用的ajax,那麼就要保證用戶登入後才能調用,也就是說驗證session。
在ajax
請求頭裡加上token
, 如
<code>$(function() { $.ajax({ type: "GET", url: "godruoyi.com", beforeSend: function(request) { request.setRequestHeader("token", "asdadsadasdasdadadad"); }, success: function(result) { alert(result); } }); });</code>
或在模板基類加上
<code>$.ajaxSetup({ headers: { 'token' : 'xxxxxxxxxxxx' } });</code>
token
可以從登陸API完成後返回的有效值,這需要你的應用自己設計了, 後續所有請求(若要驗證身份, 都帶上改token,), 服務端透過該token來標示用戶,
有點類似Oauth2
, 參考oauth2.0