我正在创建一个REST服务,该服务面向公众(在AWS API Gateway后面),并可以通过浏览器从我们的Web应用程序访问。该服务将接受并处理敏感的用户数据,因此我们需要在端点上进行身份验证。
我曾考虑过使用OAuth,但这可能意味着我们要避免将客户端机密,客户端ID暴露给浏览器。
此外,我们的应用程序是旧版网络应用程序,它使用简单的表单身份验证,因此我们不打算为此要求对其进行更改。因此,我们无法选择将OAuth与我们的登录过程集成在一起,也不能出于我们的目的使用登录用户令牌。
在这种情况下,有人可以建议一些验证服务的好方法。
答案 0 :(得分:2)
您已经意识到您的方案中的基本安全问题-客户端应用程序在连接到外部安全服务时将公开秘密。当前,尚没有策略性方法可以在公共域(用户的浏览器)中对私有服务进行安全身份验证。
您的选择如下:
在旧版Webapp中实现安全委托端点,以调用对数据的安全请求,该请求充当AWS API网关的委托。客户端UI->服务器端应用程序终端节点-> AWS API网关
在同一应用程序服务器基础结构上一起部署旧版Web应用程序和新的Rest应用程序,从而它们共享经过身份验证的会话
答案 1 :(得分:2)
我的首选是上面的Dominic的选项1,以获取新组件-REST API-面向未来:
Web后端使用客户端凭据授予来从Cognito获取访问令牌
Web后端需要将令牌发送到API-以及用于标识最终用户的附加参数
API安全模型用于验证Cognito访问令牌并识别用户
Cognito是一个新的组件,可用于理解和管理-因此要取决于它是否适合您公司的长期战略。
如果您决定采用这种方法,可以为技术集成提供建议。
答案 2 :(得分:0)
如果您已经具有基于表单的登录名,则可以将基于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");
}
}