2014-10-20 44 views
0

我有一個應用程序,這使得調用外部(第三方)服務,並想知道如果我能得到這方面的一些幫助。訪問第三方服務身份驗證

我試圖找出有幾件事情要往哪個方向走,並想知道,如果你有關於如何處理某些情況

  1. 任何類型的輸入和/或經驗,我們希望能夠創建一個服務處理第三方調用的架構,以便客戶端不需要知道它正在訪問哪個服務。例如,如果我們有辦法與第三方喜歡的DocuSign的文件簽字整合,客戶端應該只能夠調用它與整合什麼樣的服務我們的最終決定(基於一些證書,租賃等)服務。我開始創建一個接口,但是,這仍然會使客戶端確定要實例化和調用的實現,並且如果可能,我們想嘗試並分離它。 a。打電話給我們的「文檔簽名」服務,說明我們正在使用的客戶端和租戶,可能通過訪問令牌。 b。那麼文檔簽名服務將需要指出它需要什麼樣的憑證,並讓客戶知道如何登錄到該服務。例如,它可能需要重定向到授權服務器以獲取訪問令牌以發送給我們的服務以進行呼叫。

  2. 我們也有需要做哪些可以調用它需要認證的第三方服務的一些離線處理,但沒有客戶端以提示。我開始沿着存儲SAML令牌和/或用戶憑證的路線走,但這看起來很不安全。再次,作爲一個IdM僞新手,不太清楚如何處理這個問題(谷歌提出了各種選擇,但大多數,如果不是全部看起來非常不安全)。我想我們可以使用令牌加密等方式與它一起存儲,然後在運行任務並接收令牌時調用相應的授權服務器。

關於如何正確處理這些問題的任何意見?

回答

0

OK,首先你需要考慮你正在使用第三方API的調用做任何你需要做的,所以你需要記住的第一件事是,你一定會需要爲你的用戶訪問令牌訪問這些API。因此,如果你說你可以爲一個用戶使用不同的第三方API,你可能想要做的是創建一個具有CALL()方法的抽象類,該方法將被具體的類(一個對於每個第三方API),例如:

public abstract class ApiData { 

//Your variables 

protected call(String url, //Some parameters) { 
//default body 
} 

之後,您可以創建一個將覆蓋ApiData類的類。例如:

public class DocuSignApi extends ApiData { 

//Your variables 

@Override 
private call(String url, //Some parameters) { 
// APi call for DOCUSIGN 
} 

這樣,當你創建你的系統裏面的用戶,您將需要保存ApiData名單對他來說,例如:

public class MyUser { 
// All parameters 

private List<ApiData> apiCalls = new ArrayList<ApiData>(); 

} 

有了這個,你將有爲每一位用戶,所有的API調用,他可以訪問,你可以遍歷該列表上,併爲每個元素調用「呼叫()」 方法,它會調用正確的第三方API。

現在,你的第三方API登錄,這取決於每個API。很可能,您可能希望爲每個API使用一個相同的憑證,並將其用於每個客戶(他們無法訪問該憑據,您可能會在數據庫中或代碼中的某處(如屬性文件中)加密該憑證)。如果每個客戶端在每個API中都有不同的憑據,那麼您還需要在每個API上記錄他並將其他第三方訪問令牌保存在其他位置(數據庫),並允許他在到期之前使用它。

我也猜測你已經爲你的用戶實現了你自己的登錄服務。我不確定你是否在問什麼是最好和最安全的方式來做到這一點,但如果是這樣的話,我會給你一個例子。我已經完成了一些項目中的大量登錄,我使用的是OAUTH登錄。基本上你所做的是通過HTTP標頭請求加密的憑證,然後通過檢查數據庫登錄數據是否正確,讓用戶登錄或不登錄。如果登錄成功,您創建一個訪問令牌,在您的數據庫中保存訪問令牌(包含創建日期)並將其返回給您的用戶,這樣您也可以擁有過期令牌的功能,這是非常好的做法。

希望這有助於..

乾杯