2016-12-06 76 views
3

我有一個node.js REST API,並且我想將POST/PUT/DELETE調用限制爲預定義的「來源」列表(我不擁有碼)。使用客戶端令牌保護REST API調用

我看到了實現這一目標的唯一途徑是把一個令牌上的客戶端(在JS文件像谷歌分析),但我不知道如何確保這一點,因爲該令牌將在訪問靜態文件。

我應該使用什麼策略? JWT和OAuth2似乎沒有顯示,因爲它需要第一次用戶認證,但我想認證的不是用戶,而是webapps。

回答

0

你的問題有點不清楚。您可能意味着(a)您希望強烈鼓勵用戶使用該應用並防止其他代碼惡意地讓您的用戶執行某項操作,或者(b)您絕對禁止用戶使用其他代碼訪問你的服務器。

第一種選擇是可能的,確實是一個非常好的主意。第二個是不可能的,基於互聯網的工作方式。

首先,不可能。本質上,客戶端代碼可以讓您的客戶更輕鬆地工作。真正的工作將始終在服務器端完成 - 即使這隻意味着驗證數據並將其存儲在數據庫中。您的客戶端將總是能夠看到他們發送的所有HTTP請求:這就是HTTP的工作方式。你不能隱藏他們的信息。即使您動態生成令牌(請參閱下文),您也無法阻止他們在別處使用它們。他們總是可以建立一個自定義的HTTP請求,這意味着如果他們真的真的想要放棄你的應用程序,他們最終可以完成。把你的客戶端代碼想象成只是讓他們更容易執行HTTP請求,並放棄阻止他們「做錯事」的任何想法!

更好的選擇是CSRF保護,它可以爲您的服務器和客戶端提供最好的保護。這意味着將生成的令牌發送給客戶端,當他們首次登錄並驗證它時(通過查找或解密),當他們發送每個請求時。這是JWT的基礎,JWT是一個相當古老的驗證系統的漂亮實施。

0

最後你的API是公開的,因爲任何隨機的網站訪問者都必須能夠與API交互。即使您使用令牌來限制訪問,定義中的這些令牌也必須公開。即使定期過期和更新令牌(例如通過後端API或通過包含nonce算法)也無濟於事,因爲這些新令牌將再次在第三方網站上公開顯示,任何人都可以從中獲取令牌。

CSRF保護可以幫助有點,以避免瀏覽器中的跨站點濫用,但最終沒有意義,以防止某人寫一個API刮板等。

您可以做的最好的方法就是使用令牌來標識您授予訪問權限的個人網站所有者,警惕地監控您的API使用情況,當您認爲他們被濫用時無效令牌並聯系網站所有者以更好地保護他們的令牌不知何故(他們會有同樣的問題在做,但至少你有人責怪咳嗽咳嗽)。

-1

您可以使用hmac來確保這一點: 每位客戶都有一對獨特的公共/私人(例如「公共」和「私人」)關鍵字。

當客戶端發送請求時,他必須用他的私鑰發送一個nonce +他的用戶公鑰+ nonce +公鑰的hmac。

當服務器處理請求時,服務器根據他的公鑰檢索客戶端,獲取用戶的密鑰,然後驗證簽名。

Client, sample call on /api 

var nonce = "randomstring"; 
var pk = "aaa"; 
var sk = "bbb"; 

var string = "pk="+pk+"&nonce="+nonce; 

var crypto = require('crypto'); 
var hmac = crypto.createHmac('sha512', sk).update(string).digest('hex'); 

// send this payload in your request in get, put, post, .... 
var payload = string+"&hmac="+hmac; 

request.post({uri:"website.com/api?"+payload}, .... 

而且

Server side, security check 

var nonce = req.query.nonce; 
var pk = req.query.pk; 
var hmac = req.query.hmac; 

// retrieve user and his sk according to pk 
var sk = getUser(pk).sk 

// rebuild payload string 
var string = "pk="+pk+"&nonce="+nonce; 

var crypto = require('crypto'); 
var hmac_check = crypto.createHmac('sha512', sk).update(string).digest('hex'); 

if(hmac_check === hmac) { // request valid }else{ // invalid request } 
+0

因爲所有這些信息都必須嵌入客戶端JavaScript,什麼是從寫它再現了這個算法刮刀阻止我?這不是很難... – deceze

+0

由於所有的信息都嵌入在客戶端JavaScriptt中,因此無法防止報廢。所有可以使用瀏覽器完成的操作也可以通過刮刀完成。 – Dafuck

相關問題