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

Laravel/PHP集成Canva API时code verifier无效问题求助

解决Canva API OAuth流程中"Invalid code verifier"错误的思路

以下是针对你遇到的问题的具体排查方向:

  • 验证code_verifier的长度合规性
    Canva要求code_verifier是43-128字符的URL安全字符串,你当前的generateCodeVerifier函数使用random_bytes(128)生成128字节的随机数据,转成base64url后长度约为170字符,超出了128字符的上限。修改生成逻辑,确保最终字符串长度在要求范围内:

    private function generateCodeVerifier($length = 96) {
        // 生成的base64url字符串长度约为 (length * 4)/3,取96字节的话最终是128字符
        return rtrim(strtr(base64_encode(random_bytes($length)), '+/', '-_'), '=');
    }
    
  • 取消code_verifier的额外URL编码
    你在构造POST参数时对code_verifier做了urlencode,但base64url编码本身已经是URL安全的(仅包含A-Za-z0-9-_),额外编码会导致Canva收到的验证器与原始值不匹配。直接使用原始字符串即可:

    $post_fields = "grant_type=authorization_code"
        . "&code_verifier=" . $code_verifier // 移除urlencode
        . "&code=" . urlencode($code)
        . "&redirect_uri=" . urlencode('https://example.com/redirect-canva');
    
  • 严格校验redirect_uri的一致性
    确保授权请求、token请求中使用的redirect_uri,与Canva开发者平台配置的回调地址完全一致——包括协议(必须是HTTPS)、域名、路径,甚至末尾的斜杠都不能有差异。

  • 确认session中存储的code_verifier未篡改
    在回调函数中临时添加调试代码,对比生成时和回调时的code_verifier是否完全相同:

    // 在generateCodeVerifier后添加
    error_log("Generated code_verifier: " . $code_verifier);
    // 在redirect_canva函数中添加
    error_log("Stored code_verifier: " . $code_verifier);
    

    如果两者不一致,排查session存储问题:比如服务器session目录权限不足、分布式环境下未配置会话粘滞、Redis/Memcached连接异常导致数据丢失等。

  • 验证code_challenge的生成逻辑
    手动计算code_challenge是否正确:取一个已知的code_verifier,用以下步骤计算:

    1. 对code_verifier做SHA-256哈希(输出二进制数据)
    2. 将哈希结果转成base64url格式(替换+/为-_,移除末尾等号)
      对比你的generateCodeChallenge函数输出的结果是否一致,确保没有编码错误。
  • 检查PHP环境的随机数生成可靠性
    如果random_bytes在你的环境中存在熵不足的问题,尝试替换为openssl_random_pseudo_bytes生成随机数:

    private function generateCodeVerifier($length = 96) {
        return rtrim(strtr(base64_encode(openssl_random_pseudo_bytes($length)), '+/', '-_'), '=');
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:44:54