我正在使用用户池使用AWS Cognito进行身份验证,并且我在API网关上配置了所有API。我直接从Angular客户端点击cognito,将Cognito返回的令牌存储在本地存储中,并在后续调用中使用它们。
但是问题是,如果我从Angular发送的令牌已过期,则Cognito身份验证将失败,并且在这种情况下不会命中Integration后端。结果,我在Chrome中收到401错误。
然而,有趣的是,此401代码在传递给Angular的HTTP响应对象中对我不可用。 Angular接收默认的0码,这似乎是从服务器(认知或后端)收到的所有错误码的情况。
我试图进行探索,发现问题可能是因为在错误情况下网关未发送正确的CORS标头。我已阅读以下相关文档,但很遗憾,我找不到解决此问题的方法。
有人可以提出解决方案的建议。
编辑:我还在某个地方读到它是一个已知的AWS问题。是这样吗?
您可以在调用API网关之前管理Cognito会话。
在下面的示例中,getSession
方法具有一个回调,该回调将向控制台输出所有错误消息,然后返回。
////// Cognito.js
import {
CognitoUserPool,
CookieStorage
} from 'amazon-cognito-identity-js'
import config from '../config'
const cookieSettings = {
domain: '.xxxxxxxxxxx.com',
secure: true
}
export default {
cookieSettings,
pool: new CognitoUserPool({
UserPoolId: config.UserPoolId,
ClientId: config.ClientId,
Storage: new CookieStorage(cookieSettings)
})
}
//////
////// actions.js
import Cognito from './Cognito'
export function fetchUser() {
// get cognito user cookies
const cognitoUser = Cognito.pool.getCurrentUser()
if (cognitoUser != null) {
// try to get session from cognito
cognitoUser.getSession(function(err, session) {
if (err) {
console.log(err)
return;
}
fetch('https://api-gateway-url', {
headers: {
Authorization: 'Bearer ' + session.getAccessToken().getJwtToken(),
}
})
.then(response => response.json())
.then(json => console.log(json))
})
}
}