JSP和OAUTH2身份验证

时间:2017-08-04 06:40:13

标签: java jsp amazon-web-services tomcat oauth-2.0

我希望这不是一个太开放的"问题,但我真的不确定如何处理它。

我有一个用Java JSP编写的工作Web应用程序和一些在Zecat上运行的Rest接口,在Tomcat 7和MySQL DB上运行。这是一个非常简单的基于表单的应用程序。目前我在AWS上运行它。

JSP就是这样的:

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

Rest类是这样的:

@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,但是有一堆URL,每个JSP和一个Rest入口点一个。

改变这个的正确方法应该是什么?我看到的唯一方法(并且暂时不将其视为选项)是将整个应用程序重写为单个JSP脚本,其中所有不同的操作和页面都被标识为单个入口点的参数。还有另一种更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

OAuth2要求您拥有一个URI,该URI将接受来自身份验证服务器的重定向。只需一个整个应用程序的URI。处理此URI的代码应从URL参数中获取值,保存令牌(或从/token端点获取)并重定向到您已有的应用程序页面。

因此无需重写您的应用程序。例如,如果您有经过身份验证的用户的登录页面和初始仪表板,则流程将如下所示:

  1. 用户进入登录页面并点击“通过OAuth2进行身份验证”
  2. 用户被重定向到OAuth2身份验证服务器
  3. 用户传递身份验证,并使用身份验证结果重定向到新的身份验证处理URI
  4. 您的应用程序保存结果,认为用户已通过身份验证并将其重定向到初始仪表板页面。
  5. 您需要确定要使用哪种OAuth2流,存储令牌的位置以及应用程序的哪个部分将具有OAuth2客户端角色(Java后端或HTML / JavaScript前端)。如果您只需要身份验证(获取用户身份),您可能只需要一个ID令牌(来自OpenID Connect扩展)。

    有关详细信息,您可以阅读精心编写的OAuth2 RFC或一些文章/教程,而不是为您提供有关该主题的简化视图。

    编辑:验证成功后,如果要返回原来的 请求页面,在身份验证请求的state参数中包含请求的URL。您的新身份验证处理程序将保持state值不变(再次作为state URL参数),您可以将用户重定向到该URL,而不是硬编码的(仪表板)。请注意,state值还应包含用于防止OAuth2 RFC中所述的跨站点请求伪造的值。