Go AWS Cognito刷新令牌在秘密哈希上失败

Go AWS Cognito刷新令牌在秘密哈希上失败,go,aws-sdk-go,cognito,Go,Aws Sdk Go,Cognito,我在Go中使用服务器端身份验证刷新AWS Cognito令牌时遇到问题。我可以使用cognitoidentityprovider.AdminInitiateAuth方法获取id\u令牌、access\u令牌和refresh\u令牌。我已经创建了一个带有机密的用户池客户端,因此我必须在AuthParameters中提供SECRET\u散列 这一切在登录时都可以正常工作,但在刷新令牌时,相同的秘密哈希不起作用。我让tripple检查了代码,并验证了我在登录和刷新令牌时发送的秘密哈希是相同的(应该是相

我在Go中使用服务器端身份验证刷新AWS Cognito令牌时遇到问题。我可以使用
cognitoidentityprovider.AdminInitiateAuth
方法获取
id\u令牌
access\u令牌
refresh\u令牌
。我已经创建了一个带有机密的用户池客户端,因此我必须在
AuthParameters
中提供
SECRET\u散列

这一切在登录时都可以正常工作,但在刷新令牌时,相同的秘密哈希不起作用。我让tripple检查了代码,并验证了我在登录和刷新令牌时发送的秘密哈希是相同的(应该是相同的,因为它使用的用户名、clientID和clientSecret不会更改)

AWS API返回以下错误:

{
"error": "NotAuthorizedException: Unable to verify secret hash for client myClientIdHere\n\tstatus code: 400, request id: c186ecf2-57a7-11e8-a01e-f97ed64650c9"
}
我已经检查过设备跟踪是否关闭,因为文档提到在服务器端刷新令牌时这是一个问题(注意“管理员身份验证流”下)

我的刷新代码是:

AWSRefreshToken := aws.String(refreshToken)
secretHash := secretHash(email, auth.Config.ClientID, auth.Config.ClientSecret)
AWSUserPoolID := aws.String(auth.Config.UserPoolID)

input := cognitoidentityprovider.AdminInitiateAuthInput{
    AuthFlow: aws.String("REFRESH_TOKEN_AUTH"),
    AuthParameters: map[string]*string{
        "REFRESH_TOKEN": AWSRefreshToken,
        "SECRET_HASH":   &secretHash,
    },
    ClientId:   &auth.Config.ClientID,
    UserPoolId: AWSUserPoolID,
}

output, err := auth.AWSCognitoIdentityProvider.AdminInitiateAuth(&input)
秘密哈希代码(来自):

我已经检查了其他堆栈溢出问题,但它们只提到设备跟踪问题,并且需要秘密哈希。我在这里遗漏了什么?

在生成秘密哈希时,使用用户id(sub)而不是电子邮件

secretHash := secretHash(sub, auth.Config.ClientID, auth.Config.ClientSecret)

Javascript中也是如此。在工作中,我们有一个用户名属性设置为email的Cognito用户池,请参阅

在我的设置中,一些API可以使用电子邮件来计算秘密散列,但不是initiateAuth(REFRESH\u TOKEN\u AUTH/REFRESH\u TOKEN)

下面列出了将电子邮件作为我的用户名进行计算的API:

  • 初始化(用户密码验证)
  • 注册
  • 放弃密码
  • 确认放弃密码
  • 确认注册
  • 重新发送确认代码

“无法验证客户端myClientId的秘密哈希”,因此您将“myClientId”作为您的客户端ID发送。我似乎就是这样。原始身份验证允许我秘密使用用户的电子邮件,但不用于刷新令牌。我在文档中找不到支持秘密散列中AWS UUID需求的信息,也找不到为什么第一次没有UUID就可以工作的信息。有人能提供一个链接来支持这一点吗?这似乎对我不起作用,相反,我尝试了
cognito:username
字段,这对meAlright有效,所以我不能使用电子邮件来计算秘密哈希。那么解决方案是什么呢?
secretHash := secretHash(sub, auth.Config.ClientID, auth.Config.ClientSecret)