如何获取Azure AD access_token过期日期?解决JWT负载转义问题
问题解决思路
1. 引号转义问题:并非Azure AD的JWT存在格式问题
你看到的负载引号被转义,是解码工具的输出格式问题,Azure AD生成的Access Token完全符合JWT标准,负载本身是无转义的合法JSON结构。
- 解决办法:不要依赖带转义的工具输出,直接用对应编程语言的标准JWT库解析(比如Node.js用
jsonwebtoken、Java用JJWT、C#用System.IdentityModel.Tokens.Jwt),这些库会直接返回结构化对象,自动完成JSON解析,不会出现转义字符。 - 若必须用工具验证,可编写本地JWT解析脚本,或对工具输出的内容做一次JSON反序列化处理,就能得到正常的负载结构。
2. 获取Access Token过期时间的最优方式
方式一:直接解析Access Token的exp字段
这是最可靠的方式,exp是JWT负载中的绝对时间戳(Unix秒级时间),只要正确解析JWT就能拿到。本地解析+验证签名的性能极高,完全无需每次调用UserInfo端点:
- 验证签名逻辑:从Azure AD的密钥端点获取公钥(可本地缓存公钥,无需每次请求),本地验证Token的签名合法性,同时检查
aud(受众是否匹配你的API)、exp(是否过期)、nbf(是否生效)等字段,整个过程均为本地操作,速度极快。
方式二:利用Token响应中的expires_in字段
客户端从Azure AD获取Token时,响应体里会包含expires_in字段(表示Token的有效期秒数),客户端可以用当前时间加上这个秒数,计算出Token的过期时间,再在请求API时将该时间传递(比如放在请求头中)。不过这种方式存在微小的时间误差风险,可靠性略低于直接解析exp字段。
3. API会话令牌的优化方案
不建议自行生成会话Cookie,更高效的做法是:
- API首次接收Access Token时,完成本地签名验证+字段校验,然后将Token的哈希值(或唯一标识)与
exp时间缓存(比如用Redis)。 - 后续请求携带相同Access Token时,先检查缓存:若缓存未过期,直接通过授权;若缓存过期,再重新执行签名验证和字段校验,更新缓存。
- 这种方式既避免了每次调用UserInfo,也无需自行维护会话生命周期,完全依托Access Token本身的有效期。
4. 关于Azure AD的JWT标准性
Azure AD生成的Access Token(无论v1还是v2端点)严格遵循JWT规范,负载是标准JSON格式,不存在内置转义字符。你遇到的转义问题完全是解码工具的输出处理导致的,与Azure AD无关。
内容的提问来源于stack exchange,提问作者AndrewS
相关产品推荐
相关产品推荐

