当前位置: 首页 > 知识库问答 >
问题:

Cognito用户池:如何使用刷新令牌刷新访问令牌

沈自珍
2023-03-14

我正在使用Cognito用户池对系统中的用户进行身份验证。成功的身份验证将提供一个ID令牌(JWT)、一个访问令牌(JWT)和一个刷新令牌。这里的文档清楚地提到了刷新令牌可以用于刷新访问令牌,但没有提到如何使用。我的问题是,一旦我的访问令牌过期,我如何使用存储的刷新令牌再次刷新我的访问令牌?

我搜索了JavaScript SDK,但找不到任何方法来做同样的事情。我肯定错过了什么。

我还想通过Lambda函数实现这一点,该函数接收访问令牌和刷新令牌,并用刷新的访问令牌进行响应。如果有人能解释一下,那就太好了。

共有3个答案

西门安歌
2023-03-14

使用amazon cognito identity js浏览器SDK刷新会话;它主要是为您做的,除非您正在做一些不寻常的事情,否则您不需要直接处理刷新令牌。以下是您需要知道的:

假设您已经像这样实例化了用户池:

const userPool = new AmazonCognitoIdentity.CognitoUserPool({
  UserPoolId: USER_POOL_ID,
  ClientId: USER_POOL_CLIENT_ID
});

要查找验证过的最后一个用户名,您可以这样做:

const cognitoUser = cognitoUserPool.getCurrentUser();

如果它找到一个,cognitoUser将是非空的,您可以这样做,这将在需要时在幕后刷新您的令牌:

cognitoUser.getSession(function(err, data) {
  if (err) {
    // Prompt the user to reauthenticate by hand...
  } else {
    const cognitoUserSession = data;
    const yourIdToken = cognitoUserSession.getIdToken().jwtToken;
    const yourAccessToken = cognitoUserSession.getAccessToken().jwtToken;
  }
});

如果不希望这些令牌在本地存储中持久化,可以:

cognitoUser.signOut();

它的工作方式是,在成功认证后,浏览器将存储您的JWT令牌,包括刷新令牌。默认情况下,它将这些存储在浏览器的本地存储中,尽管如果需要,您可以提供自己的存储对象。默认情况下,刷新令牌在30d内有效,但它是您的UserPoolClient的属性(刷新令牌有效性),您可以更改该属性。当您执行上述操作时,getsession()将首先查看您存储中的令牌是否存在并且仍然有效;如果不存在,它将尝试使用它在那里找到的任何刷新令牌来验证您进入新会话。

文件http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html 表示iOS和Android SDK将为您完成此操作,尽管我没有使用过这些,因此无法对此进行担保。

万铭
2023-03-14

JavaScript SDK处理内部令牌的刷新。当您调用get会话来获取令牌时,在没有任何有效的缓存访问和id令牌的情况下,SDK使用刷新令牌来获取新的访问和id令牌。它调用用户身份验证,要求用户提供用户名和密码,只有当刷新令牌也过期时。

孔砚
2023-03-14

如果您的Cognito Javascript SDK无法满足您的需要,您仍然可以在SDK源代码中看到它如何处理刷新过程:

您可以在refreshSession中看到,为AuthFlow值设置的REFRESH\u TOKEN\u AUTH调用Cognito InitiateAuthendpoint,并将对象作为AuthParameters值传入。

需要配置该对象以满足用户池的需要。具体来说,如果目标应用程序客户端id具有关联的应用程序客户端机密,则可能必须传入您的机密\u散列。为与Javascript SDK一起使用而创建的用户池客户端应用程序当前不能包含客户端机密,因此不需要使用secret\u HASH来连接它们。

另一个可能让您陷入循环的警告是,如果您的用户池设置为记住设备,并且您没有将DEVICE_KEYREFRESH_TOKEN一起传入。Cognito API当前返回一个无效的刷新令牌错误,如果您传递了刷新令牌而没有传递您的DeviceKey。即使您传递的是有效的ReresToken,也会返回此错误。上面链接的线程阐明了这一点,尽管我确实希望AWS在未来更新他们的错误处理,使其不那么神秘。

正如该线程中所讨论的,如果您正在使用AdminInitiateAuth和ADMIN\u NO\u SRP\u AUTH,则成功的身份验证响应负载当前不包含NewDeviceMetadata;这意味着当您尝试刷新令牌时,将不会有任何DeviceKey传入。

我的应用程序需要用Python实现,下面是一个对我有用的示例:

def refresh_token(self, username, refresh_token):
    try:
        return client.initiate_auth(
            ClientId=self.client_id,
            AuthFlow='REFRESH_TOKEN_AUTH',
            AuthParameters={
                'REFRESH_TOKEN': refresh_token,
                'SECRET_HASH': self.get_secret_hash(username)
                # Note that SECRET_HASH is missing from JSDK
                # Note also that DEVICE_KEY is missing from my example
            }
        )
    except botocore.exceptions.ClientError as e:
        return e.response

 类似资料:
  • 我面临一个问题,以刷新谷歌访问令牌在服务器端。 我从谷歌认证服务器得到的响应只是403状态代码。信息是这样的 仅仅为了刷新访问令牌,在我的服务器上使用SSL是强制性的吗?它已经在我的本地服务器上测试过,没有附加任何SSL到它。

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 若授权服务器给客户端颁发了刷新令牌,客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起刷新请求: grant_type 必需的。值必须设置为“refresh_token”。 refresh_token 必需的。颁发给客户端的刷新令牌。 scope 可选的。如3.3节所述的访问请求的范

  • 我不熟悉,它代表。我混淆了它的两个术语:访问令牌和刷新令牌。 用户注册/登录站点后,我创建和。 将刷新标记保存在数据库或cookie中。 15分钟后,用户标记访问令牌过期。 如果用户空闲2小时,我将从cookie或DB中删除刷新令牌,否则我将使用刷新令牌续订访问令牌。 有什么优化的方法可以达到这个目的吗?

  • 我已经阅读了JWT和访问令牌和刷新令牌。我知道您必须在很短的时间(分钟)内设置访问令牌过期,并在过期时使用刷新令牌获取新的访问令牌。 我不清楚三件事: 谁检查访问令牌是否过期?客户端是否通过发送过期的访问令牌和刷新来检查并请求新的访问代码? 谁检查刷新令牌是否过期?(显然刷新令牌也需要过期,尽管需要更长的时间才能过期)。 在我看来,如果刷新令牌过期,则必须提示用户重新登录。在某些情况下(移动应用)

  • 目前访问类型处于联机状态。当我需要访问驱动器上的文件/文件夹时,我将浏览器重定向到Google URL并获得访问代码: 一切运转良好!但我只需要第一次重定向。 当我谷歌时,在google Drive API文档中,我发现我可以通过浏览器重定向获得刷新令牌,并将其保存在数据库中。(换句话说,我可以使用脱机访问)。 而且每次当我需要从google drive读取数据时,我使用刷新令牌获得访问令牌,而无