赞
踩
最近因为项目需要,使用了阿里云的验证码产品: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的时候就要。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。