JSP和OAUTH2身份验证
我希望这不是一个“太开放”的问题,但我真的不知道如何处理它。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脚本,其中将所有不同的操作和页面标识为单个入口点的参数。还有另一种更简单的方法吗?
OAuth2要求您有一个URI,它将接受来自认证服务器的重定向。整个应用程序只需一个URI。处理此URI的代码应该从URL参数中获取值,保存令牌(或从/token
端点获取它们)并重定向到您已拥有的应用程序页面。
所以没有必要重写你的应用程序。举例来说,如果你有一个登录页面,并通过验证的用户的初始仪表板,流量会是这样:
- 用户获取到登录页面和点击“通过OAuth2用户验证”
- 用户被重定向到OAuth2用户认证服务器
- 用户通过认证并得到重定向到新的认证处理URI与认证的结果
- 您的应用程序保存结果,考虑用户认证和重定向他最初的仪表板页面。
您需要决定要使用的OAuth2流的类型,存储令牌的位置以及应用程序的哪个部分具有OAuth2客户端角色(Java后端或HTML/JavaScript前端)。如果您只需要身份验证(获取用户身份),则可能只需要一个ID令牌(来自OpenID Connect扩展)。
欲了解更多信息,可以阅读写得很好OAuth2 RFC或一些文章/教程不是可以给你在主题的简化视图。
编辑:成功验证后,如果您想返回原来的 请求的页面,请在请求的state
参数中包含请求的URL。你的新的认证处理程序将保持不变(再次为state
URL参数)得到了state
值,你可以将用户重定向,而不是硬编码一个(仪表盘)到该网址。请注意,state
值还应包含用于防止OAuth2 RFC中所述的跨站请求伪造的值。
我已阅读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
我编辑了响应包括关于'state'参数的信息。 –