Java获取Azure OAuth2令牌报错(错误码900144)求助
排查Azure OAuth2授权码模式Java代码900144错误的核心方向
Azure的900144错误码本质是请求体格式/内容不符合要求,结合你Postman能正常获取令牌的前提,重点从以下几个维度核对代码:
1. 强制匹配Postman的请求头与参数编码
- 必须明确设置请求头
Content-Type: application/x-www-form-urlencoded,不能用application/json或其他类型,这是OAuth2令牌接口的硬性要求 - 对
code(授权码)、redirect_uri(回调地址)这类可能含特殊字符的参数做URL编码,比如Java中用URLEncoder.encode(param, "UTF-8")处理,避免因字符未编码导致请求体解析失败
2. 核对参数的完整性与准确性
- 确保参数名完全符合规范:
client_id、client_secret、code、redirect_uri、grant_type(固定值authorization_code),注意大小写不能错 - 检查
redirect_uri必须和Azure门户配置的完全一致,包括协议(HTTP/HTTPS)、末尾斜杠、域名路径,任何细微差异都会触发错误 - 禁止重复添加参数,比如代码中多次调用
params.add("client_id", xxx)会导致请求体冗余,触发900144
3. 修正请求体提交方式
不要把参数拼在URL的Query部分,必须以表单键值对的形式放入请求体。比如用RestTemplate的正确写法:
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("client_id", "你的ClientId"); params.add("client_secret", "你的ClientSecret"); params.add("code", "获取到的授权码"); params.add("redirect_uri", "你的回调URL"); params.add("grant_type", "authorization_code"); HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers); RestTemplate restTemplate = new RestTemplate(); String tokenResponse = restTemplate.postForObject("你的AccessTokenUrl", entity, String.class);
4. 对比Postman请求日志定位差异
- 在Java代码中打印完整请求的URL、Headers、请求体内容
- 打开Postman的"Console"查看成功请求的详情,对比两者的参数顺序、编码方式、头信息,通常能直接找到不一致的地方
内容的提问来源于stack exchange,提问作者Maveric
相关产品推荐
相关产品推荐

