You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java生成与Postman一致的SHA-256 code_challenge?

问题分析

你遇到的差异是因为PKCE规范里的code_challenge要求用base64url编码(不是普通base64),还要去掉末尾的填充字符=。你当前Java代码用的是标准base64,所以会出现/和末尾的=,而Postman严格遵循了PKCE的编码规则。

解决方法

生成code_challenge的正确流程是:

  • 对code verifier做SHA-256哈希
  • 把哈希结果转成base64url格式(自动替换+为-、/为_)
  • 移除编码结果末尾所有的=填充符
示例Java代码
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class PKCEGenerator {
    public static String getCodeChallenge(String codeVerifier) throws NoSuchAlgorithmException {
        MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = sha256.digest(codeVerifier.getBytes());
        
        // 用base64url编码,同时去掉末尾的=
        return Base64.getUrlEncoder().withoutPadding().encodeToString(hashBytes);
    }

    public static void main(String[] args) throws NoSuchAlgorithmException {
        String verifier = "6b890b254542c9de4603278153e1b127d21730d46ac2620e6e35514c";
        String challenge = getCodeChallenge(verifier);
        System.out.println(challenge); // 输出和Postman一致:EKhdok_1ZKtBrevixgZqXxEHxn5pQjKkFA4bTVOmyH4
    }
}
关键细节
  • Base64.getUrlEncoder()是Java 8+提供的专门用于base64url编码的工具,自动处理符号替换
  • .withoutPadding()方法直接去掉了标准base64会添加的=填充,完全符合PKCE的要求

内容的提问来源于stack exchange,提问作者Dale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:52:34