如何在移动端及后端解析微软身份验证返回的access token
后端Web API解析JWT Access Token实操方案
所有解析操作必须先做签名合法性校验,禁止直接解码payload字段,否则会面临伪造token的安全风险。你在jwt.io上能解析是因为jwt.io默认只做base64解码,不会校验签名合法性,后端解析时必须补全签名校验步骤。
通用实现逻辑
- 第一步:从前端请求中提取access token,一般放在请求头的
Authorization字段,格式为Bearer <token>,需要先去掉Bearer前缀拿到纯token字符串 - 第二步:拿到你签发JWT时用的签名密钥(如果是非对称加密的话拿公钥)
- 第三步:调用对应语言的JWT库,传入token、密钥、签名算法(比如HS256、RS256)做验签,验签通过后自动返回解码后的payload字段,就能拿到邮箱、姓名等自定义声明
- 第四步:可选校验token的过期时间
exp、签发方iss、受众aud等标准声明,进一步提升安全性
常见Web API框架实现示例
.NET Core Web API
先安装System.IdentityModel.Tokens.JwtNuGet包,代码示例:
using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; // 配置参数替换为你自己的签发配置 var secretKey = "你的JWT签名密钥"; var securityKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(secretKey)); var validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = securityKey, ValidateIssuer = true, ValidIssuer = "你的签发方", ValidateAudience = true, ValidAudience = "你的受众", ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; var tokenHandler = new JwtSecurityTokenHandler(); try { // 验签+解析 ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(accessToken, validationParameters, out SecurityToken validatedToken); var jwtToken = (JwtSecurityToken)validatedToken; // 获取自定义字段 var email = jwtToken.Claims.FirstOrDefault(c => c.Type == "email")?.Value; var name = jwtToken.Claims.FirstOrDefault(c => c.Type == "name")?.Value; } catch (SecurityTokenException) { // 验签失败,token无效,返回401 }
Node.js Express Web API
安装jsonwebtoken库后使用:
const jwt = require('jsonwebtoken'); // 配置参数替换为你自己的签发配置 const secretKey = '你的JWT签名密钥'; try { // 验签+解析 const payload = jwt.verify(accessToken, secretKey, { issuer: '你的签发方', audience: '你的受众' }); // 获取自定义字段 const email = payload.email; const name = payload.name; } catch (err) { // token无效,返回401 }
Python Flask/Django Web API
安装PyJWT库后使用:
import jwt # 配置参数替换为你自己的签发配置 secret_key = "你的JWT签名密钥" try: # 验签+解析 payload = jwt.decode( accessToken, secret_key, algorithms=["HS256"], issuer="你的签发方", audience="你的受众" ) email = payload.get("email") name = payload.get("name") except jwt.InvalidTokenError: # token无效,返回401
注意事项
- 如果你的JWT用的是非对称加密(比如RS256),把上面示例中的对称密钥替换成公钥即可,不需要传入私钥
- 不要硬编码密钥到代码中,建议放到环境变量、配置中心中管理
- 尽量不要在JWT的payload中存放敏感信息,因为payload只是base64编码,任何人拿到token都可以解码查看
内容的提问来源于stack exchange,提问作者Andi Thomaj
相关产品推荐
相关产品推荐

