gpt4 book ai didi

java - 天蓝色 AD B2C、java 应用程序

转载 作者:行者123 更新时间:2023-11-30 05:57:58 25 4
gpt4 key购买 nike

我已经搜索了很多关于 Spring boot 的支持、Azure AD B2C 安全性的 REST 实现,但找不到任何内容(除了 Azure AD 应用程序或 .net 应用程序)。

这是否意味着Azure AD B2C不支持java/spring boot应用程序?

如果可能,是否有人尝试过并让我知道需要从 Azure AD Web 应用程序到 Azure AD B2C Webb 应用程序进行配置更改。

期待您的支持。

谢谢

最佳答案

是的:)

适用于 Spring 授权服务器和资源服务器。我最近的实现是资源服务器(如果您只需要保护 REST API 并且您的应用程序仅消耗 token ,其他前端应用程序负责登录重定向等,这是最好的),这是一个关于使用 oAuth2 进行 spring 安全性的很棒的教程,您可以在 baeldung 找到。我基于教程的安全配置是:

    @Configuration
@EnableResourceServer
@EnableScheduling
@RequiredArgsConstructor
public class SecurityResourceServerConfig extends ResourceServerConfigurerAdapter {

@Value("${b2c.client-id}")
private String resourceId;

private final KeyUtilHandler keyUtilHandler;

@Primary
@Bean
public DefaultTokenServices customTokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}

@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {

JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setVerifierKey(keyUtilHandler.stringPublicKey());

return converter;
}

@Override
public void configure(ResourceServerSecurityConfigurer configurer) {
configurer.resourceId(resourceId);
configurer.tokenServices(customTokenServices());
}

@Override
public void configure(HttpSecurity http) throws Exception {

http
.sessionManagement().sessionCreationPolicy(STATELESS)
.and()
.authorizeRequests()
.anyRequest()
.authenticated();

}
}

如果您在 token 转换器中提供资源 id(azure 客户端 id)和 validator key (setVerifierKey),Spring 将负责向链添加一个过滤器,用于验证 token 的签名和基本声明。这就是关于安全配置的全部内容。另一件事是azure不提供 token 中的 key ,您可以通过 key id( token 中的“kid”)找到正确的公钥。 Azure 还提供必要的值来编码 key ,它们可以在为每个 B2C 租户创建的端点处的 json 对象中找到 -

https://login.microsoftonline.com/ {您的租户名称}/discovery/v2.0/keys?p={您的登录注册政策}

例如:https://login.microsoftonline.com/fabrikamb2c.onmicrosoft.com/discovery/v2.0/keys?p=b2c_1_sign_in

{
"keys": [
{"kid":"X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk","nbf":1493763266,"use":"sig","kty":"RSA","e":"AQAB","n":"tVKUtcx_n9rt5afY_2WFNvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb-h0qup5jznOvOr-Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIvkvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr_EPLMW4wHvH0zZCuRMARIJmmqiMy3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU_BUhrc2sIgfnvZ03koCQRoZmWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw-7V-P7jwrQRFfQVXw"}
]
}

您需要“n”和“e”值来为客户端应用程序编码有效 key 。有现成的库,但您可以编写自己的实现。我还使用 Rest 模板来获取 json 并提取值。根据微软文档, key 可能会不时更改,因此您可能需要安排方法。

public class KeyUtilHandler {

@Value("${b2c.key-url}")
private String keyUrl;

@Value("${b2c.sign-up-or-in-user-flow}")
private String signUpOrInUserFlow;

@Value("${b2c.tenant}")
private String tenant;

private String eValue;
private String nValue;

public String stringPublicKey(){

setAzureKeys();

byte[] modulusBytes = Base64.getUrlDecoder().decode(nValue);
BigInteger modulusInt = new BigInteger(1, modulusBytes);

byte[] exponentBytes = Base64.getUrlDecoder().decode(eValue);
BigInteger exponentInt = new BigInteger(1, exponentBytes);

KeyFactory keyFactory;

RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(modulusInt, exponentInt);

String encodedStringKey = null;

{
try {
keyFactory = KeyFactory.getInstance("RSA");

RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(publicSpec);

byte [] encodedKey = publicKey.getEncoded();

encodedStringKey = Base64.getEncoder().encodeToString(encodedKey);

} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
}
}

return String.format("-----BEGIN PUBLIC KEY-----%s-----END PUBLIC KEY-----"
, encodedStringKey);

}

private void setAzureKeys (){

String resolvedKeyUrl = String.format(keyUrl, tenant, signUpOrInUserFlow);

RestTemplate azureKeys = new RestTemplate();
AzureKeySetDto result = azureKeys.getForObject(resolvedKeyUrl, AzureKeySetDto.class);
if (Objects.isNull(result.getKeys())) {
throw new UnableToGetResourceException();
}
Map<String, String> keyMap = result.getKeys().stream()
.findFirst()
.get();
eValue = keyMap.get("e");
nValue = keyMap.get("n");
}

@Scheduled(fixedRate = TWENTY_HOURS_IN_MILIS)
private void renewKeys(){
setAzureKeys();
}
}

关于java - 天蓝色 AD B2C、java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com