【问题标题】: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】:
您已经意识到场景中的基本安全问题 - 客户端应用程序在连接到外部安全服务时会暴露机密。目前没有策略性的方法可以在公共域(用户的浏览器)中安全地向私有服务进行身份验证。
您的选择如下:
【解决方案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");
}
}