我在使用Go中的服务器端身份验证刷新AWS Cognito令牌时遇到问题。我可以使用id_token
方法获取access_token
,refresh_token
和cognitoidentityprovider.AdminInitiateAuth
。我创建了一个包含秘密的用户池客户端,因此我必须在SECRET_HASH
中提供AuthParameters
。
登录时一切正常,但刷新令牌时相同的秘密哈希不起作用。我已经检查了代码并验证了我发送的秘密哈希在登录和刷新令牌时是相同的(它应该是相同的,因为它使用用户名,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"
}
我已检查设备跟踪已关闭,因为文档提到在服务器端刷新令牌时出现此问题(请注意&#34;管理员身份验证流程&#34;,https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-server-side-authentication-flow)。< / p>
我的刷新代码是:
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)
秘密哈希码(来自https://stackoverflow.com/a/46163403/3515197):
func secretHash(username, clientID, clientSecret string) string {
mac := hmac.New(sha256.New, []byte(clientSecret))
mac.Write([]byte(username + clientID))
return base64.StdEncoding.EncodeToString(mac.Sum(nil))
}
我已经检查了其他Stack Overflow问题,但他们只提到了设备跟踪问题,并且需要秘密哈希。我在这里缺少什么?
答案 0 :(得分:3)
在生成秘密哈希时,使用用户ID(子)代替电子邮件。
secretHash := secretHash(sub, auth.Config.ClientID, auth.Config.ClientSecret)
答案 1 :(得分:0)
在 Javascript 中也是如此。在工作中,我们有一个Cognito用户池,其“用户名”属性设置为电子邮件,请参见Screenshot。
在我的设置中,某些API可以使用电子邮件来计算秘密哈希,但不 initiateAuth (REFRESH_TOKEN_AUTH / REFRESH_TOKEN)。
以下是与电子邮件作为我的用户名进行计算的API列表: