阿里云验证码功能对接,使用临时凭证时遇到的坑,报错code: 400, Specified header x-acs-security-token is mandatory for this acti
最近因为项目需要,使用了阿里云的验证码产品:https://help.aliyun.com/zh/captcha/之前研究了半天, 一直以为是request请求里面添加,没想到是生成client的时候就要。
·
转载自:https://mp.weixin.qq.com/s/B1hFFiOMHF6hA6BPZbZcIA
最近因为项目需要,使用了阿里云的验证码产品:https://help.aliyun.com/zh/captcha/
对服务端来说其实是很简单的一个接口,官方也提供了示例:
// This file is auto-generated, don't edit it. Thanks.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Tea;
using Tea.Utils;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
public static string GetEnvProperty(string propertyName)
{
// TODO 请实现非明文硬编码方式获取您的AccessKey ID 和 AccessKey Secret,比如阿里云Credentials工具(参见https://help.aliyun.com/document_detail/378659.html),或其他您的系统中安全的获取方式。
return "null";
}
public static async Task<string> GetEnvPropertyAsync(string propertyName)
{
// TODO 请实现非明文硬编码方式获取您的AccessKey ID 和 AccessKey Secret,比如阿里云Credentials工具(参见https://help.aliyun.com/document_detail/378659.html),或其他您的系统中安全的获取方式。
return "null";
}
public static void Main(string[] args)
{
// ====================== 1. 初始化配置 ======================
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
// 设置您的AccessKey ID 和 AccessKey Secret。
// getEnvProperty只是个示例方法,需要您自己实现AccessKey ID 和 AccessKey Secret安全的获取方式。
config.AccessKeyId = GetEnvProperty("ACCESS_KEY_ID");
config.AccessKeySecret = GetEnvProperty("ACCESS_KEY_SECRET");
//设置请求地址
config.Endpoint = "captcha.cn-shanghai.aliyuncs.com";
// 设置连接超时为5000毫秒
config.ConnectTimeout = 5000;
// 设置读超时为5000毫秒
config.ReadTimeout = 5000;
// ====================== 2. 初始化客户端(实际生产代码中建议复用client) ======================
AlibabaCloud.SDK.Captcha20230305.Client client = new AlibabaCloud.SDK.Captcha20230305.Client(config);
// 创建APi请求
AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaRequest request = new AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaRequest();
// 本次验证的场景ID,建议传入,防止前端被篡改场景
request.SceneId = "本次验证的场景ID";
// 前端传来的验证参数 CaptchaVerifyParam
request.CaptchaVerifyParam = "前端传来的验证参数 CaptchaVerifyParam";
// ====================== 3. 发起请求) ======================
try
{
AlibabaCloud.SDK.Captcha20230305.Models.VerifyIntelligentCaptchaResponse resp = client.VerifyIntelligentCaptcha(request);
// 建议使用您系统中的日志组件,打印返回
// 获取验证码验证结果(请注意判空),将结果返回给前端。出现异常建议认为验证通过,优先保证业务可用,然后尽快排查异常原因。
bool? captchaVerifyResult = resp.Body.Result.VerifyResult;
// 原因code
string captchaVerifyCode = resp.Body.Result.VerifyCode;
}
catch (TeaException error)
{
// 建议使用您系统中的日志组件,打印异常
// 出现异常建议认为验证通过,优先保证业务可用,然后尽快排查异常原因。
bool? captchaVerifyResult = true;
}
catch (Exception _error)
{
TeaException error = new TeaException(new Dictionary<string, object>
{
{ "message", _error.Message }
});
// 建议使用您系统中的日志组件,打印异常
// 出现异常建议认为验证通过,优先保证业务可用,然后尽快排查异常原因。
bool? captchaVerifyResult = true;
}
}
}
}
上面的示例,使用子账号,添加了对应的权限,其实是没问题的,但是使用阿里云Credentials工具,用临时凭证的话,就会出问题,我遇到的报错是:
code: 400, Specified header x-acs-security-token is mandatory for this action. request id: 487F69EC-20A5-5566-A753-A45F921B5994
我是创建了一个角色,添加了对应的权限后,调用STS服务的AssumeRole接口获取的临时凭证,需要在官方示例中添加一行代码即可:
//临时凭证需要token 官方示例没有给出 临时凭证的token
config.SecurityToken = token;
之前研究了半天, 一直以为是request请求里面添加,没想到是生成client的时候就要。
更多推荐
所有评论(0)