如何使用 boto3 为 AWS Cognito 创建 SECRET_HASH?

2023-11-27

我想使用 boto3 和 python 为 AWS Cognito 创建/计算 SECRET_HASH。这将合并到我的 fork 中warrant.

我将我的 Cognito 应用程序客户端配置为使用app client secret。但是,这破坏了以下代码。

def renew_access_token(self):
    """
    Sets a new access token on the User using the refresh token.

    NOTE:
    Does not work if "App client secret" is enabled. 'SECRET_HASH' is needed in AuthParameters.
    'SECRET_HASH' requires HMAC calculations.

    Does not work if "Device Tracking" is turned on.
    https://stackoverflow.com/a/40875783/1783439

    'DEVICE_KEY' is needed in AuthParameters. See AuthParameters section.
    https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html
    """
    refresh_response = self.client.initiate_auth(
        ClientId=self.client_id,
        AuthFlow='REFRESH_TOKEN',
        AuthParameters={
            'REFRESH_TOKEN': self.refresh_token
            # 'SECRET_HASH': How to generate this?
        },
    )

    self._set_attributes(
        refresh_response,
        {
            'access_token': refresh_response['AuthenticationResult']['AccessToken'],
            'id_token': refresh_response['AuthenticationResult']['IdToken'],
            'token_type': refresh_response['AuthenticationResult']['TokenType']
        }
    )

当我运行此程序时,我收到以下异常:

botocore.errorfactory.NotAuthorizedException: 
An error occurred (NotAuthorizedException) when calling the InitiateAuth operation: 
Unable to verify secret hash for client <client id echoed here>.

这个答案通知我使用 cognito 客户端密钥需要 SECRET_HASH。

The AWS API 参考文档AuthParameters 部分说明以下内容:

对于 REFRESH_TOKEN_AUTH/REFRESH_TOKEN:USERNAME(必需)、SECRET_HASH (如果应用程序客户端配置了客户端密钥,则为必需), REFRESH_TOKEN(必需)、DEVICE_KEY

The boto3 文档声明 SECRET_HASH 是

使用以下方法计算的密钥哈希消息身份验证代码 (HMAC) 用户池客户端的密钥和用户名加上客户端 ID 消息。

该文档解释了需要什么,但没有解释如何实现这一点。


下面get_secret_hash方法是我用 Python 为 Cognito 用户池实现编写的解决方案,示例用法:

import boto3
import botocore
import hmac
import hashlib
import base64


class Cognito:
    client_id = app.config.get('AWS_CLIENT_ID')
    user_pool_id = app.config.get('AWS_USER_POOL_ID')
    identity_pool_id = app.config.get('AWS_IDENTITY_POOL_ID')
    client_secret = app.config.get('AWS_APP_CLIENT_SECRET')
    # Public Keys used to verify tokens returned by Cognito:
    # http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html#amazon-cognito-identity-user-pools-using-id-and-access-tokens-in-web-api
    id_token_public_key = app.config.get('JWT_ID_TOKEN_PUB_KEY')
    access_token_public_key = app.config.get('JWT_ACCESS_TOKEN_PUB_KEY')

    def __get_client(self):
        return boto3.client('cognito-idp')

    def get_secret_hash(self, username):
        # A keyed-hash message authentication code (HMAC) calculated using
        # the secret key of a user pool client and username plus the client
        # ID in the message.
        message = username + self.client_id
        dig = hmac.new(self.client_secret, msg=message.encode('UTF-8'),
                       digestmod=hashlib.sha256).digest()
        return base64.b64encode(dig).decode()

    # REQUIRES that `ADMIN_NO_SRP_AUTH` be enabled on Client App for User Pool
    def login_user(self, username_or_alias, password):
        try:
            return self.__get_client().admin_initiate_auth(
                UserPoolId=self.user_pool_id,
                ClientId=self.client_id,
                AuthFlow='ADMIN_NO_SRP_AUTH',
                AuthParameters={
                    'USERNAME': username_or_alias,
                    'PASSWORD': password,
                    'SECRET_HASH': self.get_secret_hash(username_or_alias)
                }
            )
        except botocore.exceptions.ClientError as e:
            return e.response
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 boto3 为 AWS Cognito 创建 SECRET_HASH? 的相关文章

随机推荐

  • vim 折叠搞乱了语法高亮

    我使用 vim 作为 LaTeX 并且使用 Latex suite 它为我提供了很好的语法突出显示和折叠 但在大文件中 语法突出显示变得 混乱 如果我打开所有折叠 语法突出显示就会正常 但我希望它始终 正常工作 我似乎记得一个选项会增加用作
  • 如何查询 Active Directory 对象的有效权限?

    我试图以编程方式确定当前用户是否对给定的 Active Directory 对象具有某些权限 特别是在本例中 我试图确定用户是否具有其他 Exchange 用户或通讯组列表对象的 发送为 权限 我已经弄清楚如何访问ntSecurityDes
  • 如何从充当服务器的 iPhone 流式传输视频?

    我正在开发一款适用于 iOS 的应用程序 其中一台 iPhone 必须将其摄像头录像实时传输到另一台 iPhone 为简单起见 两台 iPhone 都位于同一个 Wi Fi 网络中 流媒体应该可以工作without物理互连 例如用于将流路由
  • 对通用 Java 类中的通用变量使用数学运算符

    我正在尝试编写一些代码 使我能够对 T extends Number 对象实例执行基本数学运算 它需要能够处理任何数字类型的子类Number 我知道下面的一些类型Number have add 内置方法 有些甚至有 multiply 方法
  • 转发声明未命名结构的 typedef [重复]

    这个问题在这里已经有答案了 可能的重复 未命名结构的前向声明 如果我有 typedef struct tagPAGERANGE int iFirstPage int iLastPage PAGERANGE 我可以这样转发声明 struct
  • 在 Windows Phone 8.1 中共享渲染到位图图像

    我想在 Windows Phone 8 1 中将画布作为图像共享 为此 我首先将画布转换为图像 然后共享它 我尝试了我的 Windows 8 1 代码 没有发生错误 但共享源应用程序中没有图像 仅出现描述和标题 这是代码 private a
  • 这是一个指向数组开头的指针吗?

    我刚刚帮助某人编写了一些代码 他有这个 char dataArray 10 然后想要获取指向数组开头的指针 而不是使用 dataArray 0 or just dataArray He used dataArray 他最终得到了一个指向指针
  • SP2010 客户端对象模型 3 MB 限制 - 未应用更新 maxReceivedMessageSize

    我正在使用客户端对象模型与 Sharepoint 2010 进行交互 当我尝试使用客户端 OM 上传大于 3 MB 的文档时 出现错误请求错误 微软建议this解决问题 我尝试过并更新了 maxReceivedMessageSize 属性
  • Django Rest Framework - 当尝试使用不正确的凭据登录用户时,为什么会返回 200 状态代码?

    这是我的 URLs py url r api auth include rest framework urls namespace rest framework 我的主页上有一个表单 用户可以在其中输入用户名和密码 单击提交按钮时 Angu
  • 如何在 C++ 中声明全局变量

    我知道不应该使用全局变量 但我需要它们 我读过 在函数外部声明的任何变量都是全局变量 我已经这样做了 但在另一个 cpp文件中 找不到该变量 所以它并不是真正的全球性 是不是得建立一个头文件GlobalVariabels h并将该文件包含到
  • Google Sheets API:调用者没有权限

    我正在尝试从 cron 中读取文档 https sheets googleapis com v4 spreadsheets
  • 查看网页生成源的最佳方式?

    我正在寻找一个工具 它可以为我提供正确的生成源 包括由 AJAX 请求输入到 W3 验证器中所做的 DOM 更改 我尝试过以下方法 网页开发者工具栏 根据文档类型生成无效源 例如 它删除标签的自关闭部分 丢失页面的文档类型部分 Firebu
  • Pandas 左外连接结果表大于左表

    根据我对左外连接的理解 结果表的行数不应多于左表的行数 如果这是错误的 请告诉我 我的左表有 192572 行和 8 列 我的右表有 42160 行和 5 列 我的左表有一个名为 id 的字段 它与右表中名为 key 的列匹配 因此我将它们
  • 合并相同键的值

    可以用吗awk将相同键的值放入一行 例如 a 100 b 200 a 131 a 102 b 203 b 301 我可以将它们转换为这样的文件吗 a 100 131 102 b 200 203 301 您可以像这样使用 awk awk F
  • Google plus客户端“发生内部错误”[重复]

    这个问题在这里已经有答案了 昨天 当我尝试在我的应用程序中使用 Google Plus 签署用户时 我开始收到 发生内部错误 我使用得很好并且没有更改 代码已经很长时间没有改变了 GmsClient回报 connect bindServic
  • Azure 上的 Django 不加载静态文件

    我按照下面的教程在azure上创建了一个django项目 http www windowsazure com en us develop python tutorials web sites with django 一切正常 直到我尝试安装
  • 大量 if 语句的快速替代方案

    我是java初学者 我正在制作一个简单的程序 在其中输入一些内容 如果我输入的内容与 数据库 上的其中一个内容匹配 那么它会打印一些文本 有没有比这样做更简单的方法来检查这一点 int 1 int 2 int 3 etc if USER I
  • NoClassDefFoundError:无法初始化类 androidx.customview.poolingcontainer.PoolingContainer

    使用 Jetpack Compose UI 工具1 2 0 rc01和组合编译器1 2 0 android composeOptions kotlinCompilerExtensionVersion 1 2 0 dependencies d
  • Node.js 中域的替代方案

    由于 nodev4 2 1 已发布 并且该域被标记为已弃用 所以现在我需要它的替代方案 早些时候 我曾经将请求级别变量存储在域中 以便我可以在请求的同一上下文中查找数据的其他过程中使用这些变量 我们有什么办法可以实现它吗 注意 我无法使用请
  • 如何使用 boto3 为 AWS Cognito 创建 SECRET_HASH?

    我想使用 boto3 和 python 为 AWS Cognito 创建 计算 SECRET HASH 这将合并到我的 fork 中warrant 我将我的 Cognito 应用程序客户端配置为使用app client secret 但是