Para obtener un token OIDC con el que poder llamar a APIs OAuth sin necesidad de tener un usuario logeado, necesitamos unas credenciales que pasaremos al CAS para que nos devuelva el token.

Solicitud de credenciales para el CAS

Tendremos que solicitar que se de den de alta las credenciales correspondientes en los tres entornos poniendo un Jira a Telemática (DJ-AT-SIST-TELEMATICA) indicando el client id (será la api que lo vaya a utilizar, por ejemplo "portal-api") y el scope, que nos lo debe indicar la API a la que vayamos a hacer peticiones con el token que obtengamos.

Con esto darán de alta el servicio y tendremos:

El client secret es la contraseña, así que por supuesto no se debe subir a gitlab. Para su uso, solicitaremos también (puede ser en el mismo jira) que den de alta las credenciales en Vault. Al ser el CAS el que proporciona las credenciales, telemática será el grupo emisor, y nuestra api será la que consuma dichos secretos de Vault.

Para más información, ver esta guía: MNCS - Uso de Vault

Una vez dados de alta los secretos, tendremos que solicitar la creación de política para acceso a dichos secretos (es decir, que nuestra api tenga permisos para acceder a ellos), como se indica aquí: Procedimiento para solicitud de acceso a secretos con Vault

URLs del CAS según entorno

Habrá que solicitar el token a la URL que corresponda según el entorno, según contra qué esté autenticando la API a la que vayamos a atacar con dicho token.

...

...

Obtención del token

Una vez tengamos las credenciales, obtendremos el token así:

@Component
public class FundeWebJSOAuthClient {

    @Value("${cas.oauth.url}")
    private String casUrl;
    @Value("${cas.oauth.clientid}")
    private String clientId;
    @Value("${cas.oauth.clientsecret}")
    private String clientSecret;
    @Value("${cas.oauth.scopes}")
    private String scopes;

    @Autowired
    @Qualifier("webClientTokenAdmin")
    private WebClient webClient;

    public String getClientCredentialsToken() {

        Map<String, String> response = webClient.post()
                .body(BodyInserters.fromFormData("scope", scopes).with("grant_type", "client_credentials")).retrieve()
                .bodyToMono(new ParameterizedTypeReference<Map<String, String>>() {
                })
                .block(Duration.ofSeconds(30));

        return response.get("access_token");
    }
}