C#(.NET Framework 4.7) 基于AWS Cognito调用API端点相关问题咨询
解答
问题1:ID令牌生成方法
你可以通过AWS Cognito的用户密码认证流程获取ID令牌,拿到后按Bearer <ID令牌>格式附加到HTTP请求的Authorization头即可正常调用API,具体实现逻辑参考下文代码示例。
问题2:所需参数确认
你已经持有的用户池ID、客户端ID、用户名、密码基本满足认证需求,仅可能需要补充2个可选参数:
- Cognito用户池所属的AWS区域(如美东1、东京等,直接找API供应商确认即可)
- 如果你的Cognito客户端配置了客户端密钥,需要额外向供应商索要该密钥
问题3:NuGet包兼容性及示例代码
包兼容性说明
你检索到的AWSSDK.Core、AWSSDK.CognitoIdentityProvider官方稳定版完全支持.NET Framework 4.7,直接在NuGet包管理器中搜索安装即可,不需要额外做兼容配置。
完整实现示例
using Amazon; using Amazon.CognitoIdentityProvider; using Amazon.CognitoIdentityProvider.Model; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; public class CognitoAuthHelper { // 替换为你实际的参数 private const string USER_POOL_ID = "你的用户池ID"; private const string CLIENT_ID = "你的客户端ID"; private const string USERNAME = "你的用户名"; private const string PASSWORD = "你的密码"; // 无客户端密钥则留空 private const string CLIENT_SECRET = "你的客户端密钥(可选)"; // 替换为供应商提供的Cognito区域 private static readonly RegionEndpoint _cognitoRegion = RegionEndpoint.APNortheast1; public async Task<string> GetCognitoIdTokenAsync() { var cognitoClient = new AmazonCognitoIdentityProviderClient(_cognitoRegion); var authParameters = new Dictionary<string, string> { {"USERNAME", USERNAME}, {"PASSWORD", PASSWORD} }; // 存在客户端密钥时需要计算SECRET_HASH if (!string.IsNullOrEmpty(CLIENT_SECRET)) { var secretHash = ComputeSecretHash(USERNAME, CLIENT_ID, CLIENT_SECRET); authParameters.Add("SECRET_HASH", secretHash); } var authRequest = new InitiateAuthRequest { AuthFlow = AuthFlowType.USER_PASSWORD_AUTH, ClientId = CLIENT_ID, AuthParameters = authParameters }; var authResponse = await cognitoClient.InitiateAuthAsync(authRequest); return authResponse.AuthenticationResult.IdToken; } // SECRET_HASH计算工具方法 private string ComputeSecretHash(string username, string clientId, string clientSecret) { using var hmac = new System.Security.Cryptography.HMACSHA256(System.Text.Encoding.UTF8.GetBytes(clientSecret)); var hashBytes = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(username + clientId)); return System.Convert.ToBase64String(hashBytes); } // 附加授权头调用API示例 public async Task<string> CallTargetApiAsync(string apiUrl) { var idToken = await GetCognitoIdTokenAsync(); using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", idToken); var response = await httpClient.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } }
注意事项
- ID令牌默认有效期为1小时,建议本地缓存令牌,临近过期时再重新申请,避免频繁调用Cognito接口影响性能
- 如果运行时触发认证流程未启用的报错,联系API供应商在Cognito客户端配置中开启
ALLOW_USER_PASSWORD_AUTH认证流即可
内容的提问来源于stack exchange,提问作者Jerryszz
相关产品推荐
相关产品推荐

