【问题标题】:Authentication for a publicly exposed REST endpoint公开暴露的 REST 端点的身份验证
【发布时间】:2020-03-16 22:10:38
【问题描述】:

我正在创建一个 REST 服务,该服务将面向公众(在 AWS API 网关后面)并且可以通过浏览器从我们的 Web 应用程序访问。该服务将接受和处理敏感的用户数据,因此我们需要在端点上进行身份验证。

我曾考虑过使用 OAuth,但这可能意味着将客户端密码、客户端 ID 暴露给浏览器,这是我们想要避免的。

此外,我们的应用程序是使用简单表单身份验证的旧版 Web 应用程序,我们不打算根据此要求对其进行更改。所以我们没有选择将 OAuth 与我们的登录过程集成并使用登录用户令牌来达到我们的目的。

有人可以建议在这种情况下验证服务的好方法吗?

【问题讨论】:

    标签: spring-boot authentication oauth oauth-2.0 aws-api-gateway


    【解决方案1】:

    您已经意识到场景中的基本安全问题 - 客户端应用程序在连接到外部安全服务时会暴露机密。目前没有策略性的方法可以在公共域(用户的浏览器)中安全地向私有服务进行身份验证。

    您的选择如下:

    • 在您的旧 Web 应用程序中实施一个安全委托端点,以调用您对数据的安全请求,该请求充当 AWS API 网关的委托。客户端 UI -> 服务器端应用程序端点 -> AWS API 网关

    • 在同一个应用服务器基础架构上同时部署您的旧版 webapp 和一个新的 rest 应用,从而共享经过身份验证的会话

    【讨论】:

      【解决方案2】:

      我的偏好是上面 Dominic 的选项 1,以获取新组件 - REST API - 面向未来:

      • Web 后端使用客户端凭据授权从 Cognito 获取访问令牌

      • Web 后端需要将令牌发送到 API - 以及用于识别最终用户的附加参数

      • API 安全模型用于验证 Cognito 访问令牌并识别用户

      Cognito 是一个需要理解和维护的新组件 - 因此取决于这是否符合贵公司的长期战略。

      如果您决定采用这种方法,可以就技术集成提供建议..

      【讨论】:

        【解决方案3】:

        如果您已经拥有基于表单的登录,您可以使用基于相同用户名密码的basic authentication 作为您的其余端点。请参阅下面的示例进行配置

        @Configuration
        @EnableWebSecurity
        public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
        
            @Override
            protected void configure(HttpSecurity httpSecurity) throws Exception
            {
                httpSecurity.authorizeRequests().anyRequest().authenticated();
                httpSecurity.formLogin().loginPage("/login").permitAll();
                httpSecurity.logout().logoutSuccessUrl("/logout").logoutSuccessUrl("/logout-success");
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-07-24
          • 2011-07-25
          • 2014-08-27
          • 1970-01-01
          • 2013-03-08
          • 2017-05-08
          • 2012-04-26
          • 2014-12-25
          相关资源
          最近更新 更多