Necessário fazer o controle de CORS. Esse endpoint no backend deve ser protegido pela aplicação, para ser usado apenas por usuários com permissões adequadas.
O token obtido tem validade de 2 horas.
package br.org.prf.azuremapsexample.controllers; | |
import com.azure.core.credential.AccessToken; | |
import com.azure.core.credential.TokenRequestContext; | |
import com.azure.identity.DefaultAzureCredentialBuilder; | |
import org.springframework.web.bind.annotation.GetMapping; | |
import org.springframework.web.bind.annotation.RestController; | |
import reactor.core.publisher.Mono; | |
@RestController | |
public class AzureMapTokenController { | |
@GetMapping("/aztoken") | |
public Mono<String> aztoken(){ | |
// 'com.azure.spring:azure-spring-boot-starter' e 'com.azure:azure-identity' | |
// Vai procurar uma credencial, seja do usuário logado atualmente na linha de comando `az login` | |
// Seja usando o serivço de credenciais se tiver rodando dentro da azure (Managed Identity) | |
// Seja usando as variáveis de ambiente AZURE_TENANT_ID, AZURE_CLIENT_ID e AZURE_CLIENT_SECRET | |
var credential = new DefaultAzureCredentialBuilder().build(); | |
var context = new TokenRequestContext().addScopes("https://atlas.microsoft.com/.default"); | |
var accessToken = credential.getToken(context); | |
// A função de autenticação do maps skd espera somente o token e em texto plano. | |
// return accessToken.map(tokenEnvelope -> tokenEnvelope.getToken()); | |
return accessToken.map(AccessToken::getToken); | |
} | |
} |
Exemplo de utilização do endpoint de tokens: https://codepen.io/azuremaps/pen/BapjZVY
//Initialize a map instance.
var map = new atlas.Map('map', {
center: [-73.985708, 40.75773],
zoom: 9,
view: "Auto",
//Add your Azure Maps subscription client ID to the map SDK.
authOptions: {
authType: "aad",
clientId: "04ec075f-3827-4aed-9975-d56301a2d663", //Your Azure Maps account Client ID is required to access your Azure Maps account.
getToken: function (resolve, reject, map) {
//URL to your authentication service that retrieves an Azure Active Directory Token.
var tokenServiceUrl = "https://azuremapscodesamples.azurewebsites.net/Common/TokenService.ashx";
fetch(tokenServiceUrl).then(r => r.text()).then(token => resolve(token));
}
}
});
Um exemplo de um container pronto pra fazer essa obtenção do token:
https://github.com/weltonrodrigo/azure-token-helper/blob/main/README.md
Mas nesse caso, a única "proteção" é o CORS, não a sessão do usuário.