如何在Node.js和Java中实现Azure Map getToken API?
实现Azure Maps的getToken API(Node.js & Java)
Node.js 实现方式
场景1:Node.js后端提供Token接口,前端调用获取
先在Node.js后端编写接口生成Azure Maps访问令牌,前端通过调用该接口拿到令牌后传入resolve:
后端代码(基于Azure Identity SDK)
const { DefaultAzureCredential } = require("@azure/identity"); const { MapsManagementClient } = require("@azure/arm-maps"); async function getAzureMapsToken() { const credential = new DefaultAzureCredential(); const client = new MapsManagementClient(credential, "<你的Azure订阅ID>"); // 获取Maps账户的访问令牌 const tokenResponse = await client.accounts.getSharedAccessToken( "<资源组名称>", "<Maps账户名称>", { scopes: ["https://atlas.microsoft.com/.default"], expiresInMinutes: 60 // 按需设置令牌有效期 } ); return tokenResponse.accessToken; } // 用Express暴露接口供前端调用 const express = require("express"); const app = express(); app.get("/get-maps-token", async (req, res) => { try { const token = await getAzureMapsToken(); res.json({ token }); } catch (err) { res.status(500).json({ error: err.message }); } }); app.listen(3000, () => console.log("后端服务运行在3000端口"));
前端getToken回调实现
let Options = { authOptions: { authType: AuthenticationType.anonymous, clientId: "<你的Azure Maps Client ID>", getToken: async (resolve, reject) => { try { // 调用后端接口获取令牌 const response = await fetch("http://localhost:3000/get-maps-token"); const data = await response.json(); resolve(data.token); } catch (err) { reject(err); } } } };
场景2:Node.js环境直接生成Token(如Electron应用)
如果是在Node.js环境中直接使用Azure Maps SDK,可直接在getToken回调内调用SDK获取令牌:
const { DefaultAzureCredential } = require("@azure/identity"); let Options = { authOptions: { authType: AuthenticationType.anonymous, clientId: "<你的Azure Maps Client ID>", getToken: async (resolve, reject) => { try { const credential = new DefaultAzureCredential(); // 请求Azure Maps的访问令牌 const tokenResult = await credential.getToken("https://atlas.microsoft.com/.default"); resolve(tokenResult.token); } catch (err) { reject(err); } } } };
Java 实现方式
后端生成Token接口,前端调用
使用Azure Identity Java SDK生成Azure Maps访问令牌,通过Spring Boot暴露接口供前端调用:
Maven依赖
<dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.12.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.2.0</version> </dependency> </dependencies>
Java后端代码(Spring Boot示例)
import com.azure.core.credential.AccessToken; import com.azure.core.credential.TokenCredential; import com.azure.core.credential.TokenRequestContext; import com.azure.identity.DefaultAzureCredential; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MapsTokenController { @GetMapping("/get-maps-token") public String getAzureMapsToken() { TokenCredential credential = new DefaultAzureCredential(); TokenRequestContext context = new TokenRequestContext() .addScopes("https://atlas.microsoft.com/.default"); AccessToken token = credential.getToken(context).block(); return token.getToken(); } }
前端getToken回调实现
let Options = { authOptions: { authType: AuthenticationType.anonymous, clientId: "<你的Azure Maps Client ID>", getToken: async (resolve, reject) => { try { const response = await fetch("http://localhost:8080/get-maps-token"); const token = await response.text(); resolve(token); } catch (err) { reject(err); } } } };
关键注意事项
- 权限配置:确保使用的服务主体或托管标识拥有Azure Maps账户的
Maps Data Reader或对应操作权限 - 令牌有效期:按需设置过期时间,减少不必要的令牌请求
- 安全防护:后端接口需添加权限验证,防止未授权的令牌请求
内容的提问来源于stack exchange,提问作者andy fang
相关产品推荐
相关产品推荐

