我将 Angular 与 bff (Spring Boot 3.2) 一起使用,将 api 与 Spring Boot 3.2 一起使用。
Bff使用Spring Cloud进行身份验证。 Angular 从 Bff 获取令牌并将其发送到“Authorization”标头中的 api 后端。
工作正常,现在我搜索使用加密令牌。
我想知道azure是否可以返回一个加密的令牌..并且在api后端可以自动验证这个加密的令牌?
否则我需要解密令牌,我应该在安全配置中执行此操作?
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@Slf4j
public class SecurityConfig {
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors(cors -> cors.configurationSource(request -> {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("*"));
configuration.setAllowedHeaders(Arrays.asList("*"));
return configuration;
}))
.csrf().disable().httpBasic().disable().headers().xssProtection().and()
.and().headers().frameOptions().sameOrigin()
.and().authorizeHttpRequests().requestMatchers(HttpMethod.GET, "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", "/actuator/**").permitAll().and()
.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and().authorizeHttpRequests().anyRequest().authenticated();nticated();
http.build();
}
}
如果您在端点之间的通信中使用 https,则无需加密令牌。
JWT 包含三个部分。标头、有效负载和签名,以点分隔。用于授权的承载令牌通常采用 Base64 编码。您可以对令牌进行 Base64 解码并查看不同的部分。
签名起到防篡改作用。 HTTP 传输层安全性 (TLS) 用于保护传输中的数据隐私。除了临时会话内存之外,您不需要将令牌存储在任何地方。
签名基本上是令牌标头+有效负载的加密哈希。当 Microsoft Identity Platform 生成令牌时,它将执行哈希函数 - 通常是 SHA256。然后,它根据 RSA 算法使用密钥(加密密钥对的私有部分)加密该哈希值。结果是 HMACSHA256。令牌内的签名是加密的,唯一可以解密的一方是 Microsoft。
如果有人更改正文的内容(包含声明),例如,试图冒充不同的用户,或添加更多声明/权限,则签名将变得无效,因为标头的哈希值+ 有效负载将完全不同。即使只有最轻微的修改。
您的后端能够使用令牌签名公钥来验证签名,Microsoft 发布该公钥供任何人查看。它解密令牌中的签名,执行自己的散列,并将其与令牌中的内容进行比较。如果它们匹配,那么依赖方(您的后端,或者可能是其他应用程序或 API,例如 Graph)可以确保令牌没有被伪造或篡改。