2017-08-04 126 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'参数的信息。 –