开发者社区 问答 正文

验证码验证2.0,服务端验证报错:code: 400

验证码验证2.0,服务端验证报错:code: 400, Specified header x-acs-security-token is mandatory for this action. request id: 487F69EC-20A5-5566-A753-A45F921B5994,完全按照官方提供的示例写的代码,
AccessKeyId,AccessKeySecret用了临时凭证,C#代码

    var data = new AliYunService().OSS();

            var accessKeyId = data.get<string>("AccessKeyId");
            var accessKeySecret = data.get<string>("AccessKeySecret");
            var client = InitService.CaptchaClient(accessKeyId, accessKeySecret);
            // 创建APi请求
            AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaRequest request = new AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaRequest();
            // 本次验证的场景ID,建议传入,防止前端被篡改场景
            request.SceneId = sceneid;
            // 前端传来的验证参数 CaptchaVerifyParam
            request.CaptchaVerifyParam = captchaverifyparam;
            // ====================== 3. 发起请求) ====================== 
            try {
                AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
                AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaResponse resp = client.VerifyIntelligentCaptchaWithOptions(request, runtime);
                // 建议使用您系统中的日志组件,打印返回
                // 获取验证码验证结果(请注意判空),将结果返回给前端。出现异常建议认为验证通过,优先保证业务可用,然后尽快排查异常原因。
                bool? captchaVerifyResult = resp.Body.Result.VerifyResult;
                // 原因code
                string captchaVerifyCode = resp.Body.Result.VerifyCode;
                if (captchaVerifyResult.HasValue && captchaVerifyResult.Value) {
                    result.success = true;
                    result.msg = "验证成功";
                } else {
                    result.success = false;
                    result.msg = istest == 1 ? captchaVerifyCode : "验证失败";
                }
            } catch (TeaException error) {
                // 建议使用您系统中的日志组件,打印异常
                // 出现异常建议认为验证通过,优先保证业务可用,然后尽快排查异常原因。
                //bool? captchaVerifyResult = true;
                result.success = istest == 1 ? false : true;
                result.msg = istest == 1 ? error.Message : "验证成功";
            } catch (Exception _error) {
                //TeaException error = new TeaException(new Dictionary<string, object>
                //{
                //                        { "message", _error.Message }
                //                });
                // 建议使用您系统中的日志组件,打印异常
                // 出现异常建议认为验证通过,优先保证业务可用,然后尽快排查异常原因。
                //bool? captchaVerifyResult = true;
                result.success = istest == 1 ? false : true;
                result.msg = istest == 1 ? _error.Message : "验证成功";
            }

展开
收起
游客ijznfsw77x2ey 2024-01-12 16:58:38 1353 分享 版权
5 条回答
写回答
取消 提交回答
  • 根据你提供的错误信息“Specified header x-acs-security-token is mandatory for this action”,这表明在调用阿里云验证码服务时,请求头中缺少了安全令牌(Security Token)。

    阿里云STS(Security Token Service)提供的临时凭证除了包含AccessKeyId和AccessKeySecret外,还包括一个SessionToken(也就是错误中提到的"x-acs-security-token")。在使用临时凭证进行API调用时,需要将这个SessionToken放入HTTP请求头中。

    针对你提供的C#代码,需要确保在初始化客户端或发起请求时,将STS返回的SessionToken添加到请求头中。大致修改如下:

    // 假设你已经有了 SessionToken
    var sessionToken = data.get<string>("SessionToken");
    
    // 初始化客户端时需要将 SessionToken 传递进去
    var config = new Config AlibabaCloud.Rpc.Config
    {
        AccessKeyId = accessKeyId,
        AccessKeySecret = accessKeySecret,
        // 添加 SessionToken
        SecurityToken = sessionToken
    };
    
    var client = new CaptchaClient(config);
    
    // ... 接下来的代码不变 ...
    

    请根据你实际使用的SDK版本和调用方式调整设置SessionToken的方式。如果使用的SDK版本支持RuntimeOptions,那么可以在RuntimeOptions中设置:

    // 创建RuntimeOptions,并设置SecurityToken
    AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    runtime.Headers["x-acs-security-token"] = sessionToken;
    
    // 然后在调用方法时传入RuntimeOptions
    AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaResponse resp = client.VerifyIntelligentCaptchaWithOptions(request, runtime);
    
    2024-01-27 22:30:58
    赞同 1 展开评论
  • 请求参数不正确、格式不符、缺失必要参数或者请求体内容有误

    2024-01-15 10:48:55
    赞同 展开评论
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的信息,您在使用阿里云的验证码验证2.0服务时遇到了错误。错误代码为400,提示指定的header x-acs-security-token是必需的。为了解决这个问题,请确保在您的C#代码中正确设置了x-acs-security-token header。

    以下是一个示例代码,展示了如何在C#中使用临时凭证调用阿里云的验证码验证2.0服务:

    using System;
    using System.Net.Http;
    using System.Text;
    using Newtonsoft.Json;
    
    class Program
    {
        static void Main()
        {
            string accessKeyId = "your_access_key_id";
            string accessKeySecret = "your_access_key_secret";
            string action = "your_action"; // 例如:"GetVerificationCode"
            string codeType = "your_code_type"; // 例如:"SMS"
            string phoneNumber = "your_phone_number";
    
            // 创建HTTP客户端
            using (var httpClient = new HttpClient())
            {
                // 设置请求头
                httpClient.DefaultRequestHeaders.Add("x-acs-version", "2016-09-27");
                httpClient.DefaultRequestHeaders.Add("x-acs-action", action);
                httpClient.DefaultRequestHeaders.Add("x-acs-region-id", "cn-hangzhou");
                httpClient.DefaultRequestHeaders.Add("x-acs-request-param", $"codeType={codeType}&phoneNumber={phoneNumber}");
                httpClient.DefaultRequestHeaders.Add("x-acs-signature-method", "HMAC-SHA1");
                httpClient.DefaultRequestHeaders.Add("x-acs-timestamp", DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"));
                httpClient.DefaultRequestHeaders.Add("x-acs-signature-nonce", Guid.NewGuid().ToString());
                httpClient.DefaultRequestHeaders.Add("x-acs-accesskey-id", accessKeyId);
                httpClient.DefaultRequestHeaders.Add("x-acs-accesskey-secret", accessKeySecret);
    
                // 发送请求并获取响应
                var response = httpClient.GetAsync("https://dysmsapi.aliyuncs.com/?Action=GetVerificationCode&Version=2017-05-25").Result;
                var content = response.Content.ReadAsStringAsync().Result;
    
                // 解析响应内容
                var result = JsonConvert.DeserializeObject<dynamic>(content);
                if (result.Code == "OK")
                {
                    Console.WriteLine("验证码已发送,请查收。");
                }
                else
                {
                    Console.WriteLine($"发送失败,错误信息:{result.Message}");
                }
            }
        }
    }
    

    请注意,您需要将your_access_key_idyour_access_key_secretyour_actionyour_code_typeyour_phone_number替换为您自己的实际值。此外,您还需要安装Newtonsoft.Json库以处理JSON数据。

    2024-01-12 21:28:41
    赞同 展开评论
  • 北京阿里云ACE会长

    报错信息中提到"Specified header x-acs-security-token is mandatory for this action",这意味着您需要在请求头中添加x-acs-security-token。
    请尝试在发起请求时添加x-acs-security-token,如下所示:

    // 添加x-acs-security-token到请求头
    var headers = new Dictionary();
    headers.Add("x-acs-security-token", "your_security_token");
    AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    runtime.Headers = headers;
    AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaResponse resp = client.VerifyIntelligentCaptchaWithOptions(request, runtime);

    请将"your_security_token"替换为您实际的security token。如果仍然遇到问题,请检查您的AccessKeyId、AccessKeySecret和security token是否正确。

    2024-01-12 20:45:36
    赞同 展开评论
  • 对了,用openapi调用测试是成功的

    2024-01-12 17:18:00
    赞同 展开评论