Node.js 在React应用程序中创建一个安全层,对未经身份验证的用户隐藏web服务

Node.js 在React应用程序中创建一个安全层,对未经身份验证的用户隐藏web服务,node.js,reactjs,service,liferay,authorization,Node.js,Reactjs,Service,Liferay,Authorization,我在一个React应用程序中工作,它基本上会将密码重置为未经身份验证的用户。问题是,为了使用Ajax做到这一点,我公开了服务url(这是不安全的,我无法解决这个问题,因为项目的这一部分属于其他公司) 我的想法是(我以前从来没有这样做过,所以我不确定这是怎么回事)在中间创建某种休止服务,“隐藏”用户真正的服务,所以我称它为“HE”,调用实际的服务器,给我所需要的数据。 但是,我需要保护这项新服务,这样只有我的应用程序才能使用它,对吗?。如果这是一种很好的方法,那么如何对未经身份验证的用户实现这一点

我在一个React应用程序中工作,它基本上会将密码重置为未经身份验证的用户。问题是,为了使用Ajax做到这一点,我公开了服务url(这是不安全的,我无法解决这个问题,因为项目的这一部分属于其他公司)

我的想法是(我以前从来没有这样做过,所以我不确定这是怎么回事)在中间创建某种休止服务,“隐藏”用户真正的服务,所以我称它为“HE”,调用实际的服务器,给我所需要的数据。 但是,我需要保护这项新服务,这样只有我的应用程序才能使用它,对吗?。如果这是一种很好的方法,那么如何对未经身份验证的用户实现这一点?。如果没有,我能做些什么来解决这个问题

我对任何想法都持开放态度,我曾计划使用Node.js,但我在这方面没有任何经验


欢迎任何帮助,提前谢谢

如果您无法对现有服务进行任何更改,并且它位于非安全环境中,那么您的想法是正确的。最好创建一个从UI调用的REST服务,该REST服务反过来应该调用您现有的服务。
现在,如果您没有任何功能来验证用户,那么我不确定如何确保REST服务的安全。即使您创建了一个REST服务,如果您没有任何方法来验证用户身份,它也无法解决您的目的。即使是REST服务也会暴露出来,无法解决您的问题。

如果您具有对用户进行身份验证的功能,如在调用此服务或登录屏幕之前创建会话或捕获一些详细信息等,这将作为在访问其他服务之前验证用户的一种方式,然后您就有了一个解决方案。

如果您无法对现有服务进行任何更改,并且它位于非安全环境中,那么您的想法是正确的。最好创建一个从UI调用的REST服务,该REST服务反过来应该调用您现有的服务。
现在,如果您没有任何功能来验证用户,那么我不确定如何确保REST服务的安全。即使您创建了一个REST服务,如果您没有任何方法来验证用户身份,它也无法解决您的目的。即使是REST服务也会暴露出来,无法解决您的问题。

如果您具有对用户进行身份验证的功能,如在调用此服务或登录屏幕之前创建会话或捕获一些详细信息等,这将作为访问其他服务之前验证用户的一种方式,那么您就有了一个解决方案。

如果您需要对用户进行身份验证,最新的做法是使用电子邮件——假设只有用户可以访问他的电子邮件。(这也是最便宜的)

当你生成url的时候你需要小心。基本上,您需要确保它是唯一的,不公开发布,并且在短时间内与特定用户关联。最常见、最直接的方法是在url中添加标记。现在,令牌生成有几个加密要求,我建议不要为此功能创建自己的代码。作为一次性使用令牌的示例,我们可以检查

但是,当您在这个线程上标记LIFELYAY时,您可以考虑使用UsSerialService生成电子邮件。 或者从以下URL生成代码中获得灵感:

        Date expirationDate = null;

        if ((passwordPolicy != null) &&
            (passwordPolicy.getResetTicketMaxAge() > 0)) {

            expirationDate = new Date(
                System.currentTimeMillis() +
                    (passwordPolicy.getResetTicketMaxAge() * 1000));
        }

        Ticket ticket = ticketLocalService.addDistinctTicket(
            companyId, User.class.getName(), user.getUserId(),
            TicketConstants.TYPE_PASSWORD, null, expirationDate,
            serviceContext);

        StringBundler sb = new StringBundler(6);

        sb.append(serviceContext.getPortalURL());
        sb.append(serviceContext.getPathMain());
        sb.append("/portal/update_password?p_l_id=");
        sb.append(serviceContext.getPlid());
        sb.append("&ticketKey=");
        sb.append(ticket.getKey());

        passwordResetURL = sb.toString();

如果需要对用户进行身份验证,最新的做法是使用电子邮件——假设只有用户可以访问他的电子邮件。(这也是最便宜的)

当你生成url的时候你需要小心。基本上,您需要确保它是唯一的,不公开发布,并且在短时间内与特定用户关联。最常见、最直接的方法是在url中添加标记。现在,令牌生成有几个加密要求,我建议不要为此功能创建自己的代码。作为一次性使用令牌的示例,我们可以检查

但是,当您在这个线程上标记LIFELYAY时,您可以考虑使用UsSerialService生成电子邮件。 或者从以下URL生成代码中获得灵感:

        Date expirationDate = null;

        if ((passwordPolicy != null) &&
            (passwordPolicy.getResetTicketMaxAge() > 0)) {

            expirationDate = new Date(
                System.currentTimeMillis() +
                    (passwordPolicy.getResetTicketMaxAge() * 1000));
        }

        Ticket ticket = ticketLocalService.addDistinctTicket(
            companyId, User.class.getName(), user.getUserId(),
            TicketConstants.TYPE_PASSWORD, null, expirationDate,
            serviceContext);

        StringBundler sb = new StringBundler(6);

        sb.append(serviceContext.getPortalURL());
        sb.append(serviceContext.getPathMain());
        sb.append("/portal/update_password?p_l_id=");
        sb.append(serviceContext.getPlid());
        sb.append("&ticketKey=");
        sb.append(ticket.getKey());

        passwordResetURL = sb.toString();

这个想法是有的,但我看到的最佳实践是向用户发送电子邮件,以便他们可以验证密码重置是否已启动,一旦他们单击该按钮,则可以更改密码。未经进一步验证,您不应允许用户根据用户名更改密码。如果您创建了一个可以控制的端点,但该端点不安全,无法与另一个端点进行通信,则处于相同的情况。如果您创建端点的目的是不公开另一家公司的服务url,那么这将是一个很好的方法。@diegoalmesp可以使用Spring security为所有服务实现基本身份验证。这个想法是存在的,但我看到的最佳实践是向用户发送电子邮件,以便他们可以验证密码重置已启动,一旦他们单击该按钮,则可以更改密码。未经进一步验证,您不应允许用户根据用户名更改密码。如果您创建了一个可以控制的端点,但该端点不安全,无法与另一个端点进行通信,则处于相同的情况。如果您创建端点的目的是不公开另一家公司的服务url,那么这将是一个很好的方法。@diegoalmesp您可以使用Spring security为所有服务实现基本身份验证吗。