2017-08-04 170 views
0

我希望這不是一個「太開放」的問題,但我真的不知道如何處理它。JSP和OAUTH2身份驗證

我有一個使用Java JSP編寫的工作Web應用程序,以及一些運行在Tomcat 7和MySQL DB上的Rest的澤西接口。這是一個非常簡單的基於表單的應用程序。目前我已在AWS上運行。

的JSP是這樣的:

<% 
String inmsg = request.getParameter("msg"); 
%> 
<html> 
<head> 
... 

,其餘類是這樣的:

@Path("/operation") 
public class IntrfcOperation { 

String response=""; 
int retcode=0; 
String id; 
String name; 

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response baserest(
      @Context HttpServletRequest hsreq, 
      @Context HttpServletResponse hsresp) 
    { 
     response =""; 
     ... 
     String outjson = "{\"retcode\":\"" + retcode + "\",\"name\":\"" + name + "\",\"msg\":\"" + response + "\"}"; 
     return Response.status(200).entity(outjson).build(); 
    } 

我想結合認證層,我想用一個OpenID/OAuth2用戶服務器,可能是AWS的(IAM?)。我看到的問題是,該協議(就我所嘗試的)而言,需要一個/唯一的重定向url,這是發送到Identity Manager的每個請求的返回點。我的問題是,我沒有一個URL,而是一堆,每個JSP和Rest入口點都有一個。

什麼應該是正確的方法來改造呢?我看到的唯一方法(並且在此刻沒有將其視爲選項)是將整個應用程序重寫爲單個JSP腳本,其中將所有不同的操作和頁面標識爲單個入口點的參數。還有另一種更簡單的方法嗎?

回答

1

OAuth2要求您有一個URI,它將接受來自認證服務器的重定向。整個應用程序只需一個URI。處理此URI的代碼應該從URL參數中獲取值,保存令牌(或從/token端點獲取它們)並重定向到您已擁有的應用程序頁面。

所以沒有必要重寫你的應用程序。舉例來說,如果你有一個登錄頁面,並通過驗證的用戶的初始儀表板,流量會是這樣:

  1. 用戶獲取到登錄頁面和點擊「通過OAuth2用戶驗證」
  2. 用戶被重定向到OAuth2用戶認證服務器
  3. 用戶通過認證並得到重定向到新的認證處理URI與認證的結果
  4. 您的應用程序保存結果,考慮用戶認證和重定向他最初的儀表板頁面。

您需要決定要使用的OAuth2流的類型,存儲令牌的位置以及應用程序的哪個部分具有OAuth2客戶端角色(Java後端或HTML/JavaScript前端)。如果您只需要身份驗證(獲取用戶身份),則可能只需要一個ID令牌(來自OpenID Connect擴展)。

欲瞭解更多信息,可以閱讀寫得很好OAuth2 RFC或一些文章/教程不是可以給你在主題的簡化視圖。

編輯:成功驗證後,如果您想返回原來的 請求的頁面,請在請求的state參數中包含請求的URL。你的新的認證處理程序將保持不變(再次爲state URL參數)得到了state值,你可以將用戶重定向,而不是硬編碼一個(儀表盤)到該網址。請注意,state值還應包含用於防止OAuth2 RFC中所述的跨站請求僞造的值。

+0

我已閱讀RFC和許多教程,但我總是以相同的問題結束(也許我沒有正確解釋過):沒有中央儀表板,但許多jsp可以通過菜單導航。這意味着多個URL(http://url/path/page1.jsp,http://url/path/page2.jsp ... http://url/path/pageX.jsp)。每個人都應該有一些身份驗證功能(沒有令牌 - >重定向到登錄頁面並返回)。和OpenId/Oauth2一樣,我應該爲每個url定義一個不同的APP或者將它們作爲參數導航(navigator.jsp?page1,navigator.jsp?page2,... navigator.jsp?pageX) – jordi

+0

我編輯了響應包括關於'state'參數的信息。 –