我正在处理用户在使用后没有显式退出Web应用程序的问题,这对于用例而言不够安全。这是一个具有AWS Amplify和Cognito的React应用。
我计划通过跟踪数据库中的会话来做到这一点(我可以使用在PostAuthentication_Authentication或TokenGeneration_RefreshTokens事件中使用Go语言编写的Cognito Lambda触发器捕获会话的开始或刷新),并在一段时间不活动之后使用GlobalSignOut终止会话,但是为了使用户在放弃会话时刷新令牌无效,我需要访问令牌,该令牌似乎仅对客户端可用。
我可以从Web客户端登录时显式获取此信息,然后使用GraphQL将其发布回数据库以进行记录,但令我惊讶的是,发送给Lambda事件触发器的Cognito有效负载中不提供此信息。我还不确定如果在继续使用应用程序一小时后刷新了令牌,该如何在客户端上获取刷新的令牌,而又不增加应用程序的每次更改的开销。
如果您正在客户端上使用Amplify进行身份验证流程,是否可以通过Lambda函数之类的服务器端进程为Cognito用户请求当前访问令牌?我在cognitoidentityprovider中看不到任何允许我检索访问令牌的内容,但是显然必须使用GlobalSignOut。
答案 0 :(得分:0)
我找到了一个不涉及获取访问令牌服务器端的可行解决方案。我们将AppSync用于GraphQL-访问令牌与每个GraphQL请求一起作为授权标头传递,可以按如下所示在请求模板中对其进行访问:
#set( $myMap = {
"field": "${field}",
"user_id": $context.identity.sub,
"source_ip": $context.identity.sourceIp,
"arguments": $context.arguments,
"access_token": $context.request.headers.authorization
} )
{
"version" : "2017-02-28",
"operation": "Invoke",
"payload": $util.toJson($myMap)
}
在每个Lambda解析器中,我只在遇到访问令牌时才对其进行缓存,因此我始终拥有当前用户的最新访问令牌。然后,我的计划会话管理器功能会从缓存中检索它通过废弃会话检测到的所有用户的访问令牌,并将其用作GlobalSignOut的输入。
答案 1 :(得分:0)
您可以改为使用带有PKCE的授权代码流,以便客户端仅暴露给该代码,然后使用令牌端点的cognito用户池/ id令牌,访问令牌和刷新令牌在服务器端交换该代码。您可以将用户池令牌返回给客户端,因为该令牌将在一个小时后过期,同时将刷新令牌保留在服务器端的会话管理器中,从而允许您根据需要获取新令牌或根据需要使会话无效。>
https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html