我希望这不是一个太开放的"问题,但我真的不确定如何处理它。
我有一个用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脚本,其中所有不同的操作和页面都被标识为单个入口点的参数。还有另一种更简单的方法吗?
答案 0 :(得分:1)
OAuth2要求您拥有一个URI,该URI将接受来自身份验证服务器的重定向。只需一个整个应用程序的URI。处理此URI的代码应从URL参数中获取值,保存令牌(或从/token
端点获取)并重定向到您已有的应用程序页面。
因此无需重写您的应用程序。例如,如果您有经过身份验证的用户的登录页面和初始仪表板,则流程将如下所示:
您需要确定要使用哪种OAuth2流,存储令牌的位置以及应用程序的哪个部分将具有OAuth2客户端角色(Java后端或HTML / JavaScript前端)。如果您只需要身份验证(获取用户身份),您可能只需要一个ID令牌(来自OpenID Connect扩展)。
有关详细信息,您可以阅读精心编写的OAuth2 RFC或一些文章/教程,而不是为您提供有关该主题的简化视图。
编辑:验证成功后,如果要返回原来的
请求页面,在身份验证请求的state
参数中包含请求的URL。您的新身份验证处理程序将保持state
值不变(再次作为state
URL参数),您可以将用户重定向到该URL,而不是硬编码的(仪表板)。请注意,state
值还应包含用于防止OAuth2 RFC中所述的跨站点请求伪造的值。