AWS Cognito - JavaScript 中的开发人员身份验证(浏览器)

2024-03-03

我在浏览器脚本中获取凭据时遇到问题。

身份验证服务器返回 cognito_identityId 和 cognito_token。

然后我设置了一个Cookie:

  • $.cookie('cognitoidentityId')
  • $.cookie('cognito_token')

我尝试在浏览器上通过 4 种方式获取凭据,但均失败:

  1. 认知身份凭证

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'us-east-1:xxxxxxxxxxxx'
        IdentityId: $.cookie('cognito_identityId'),
        Logins: {
            'myauth': $.cookie('cognito_token')
        }
    });
    

    // => 错误:参数中缺少必需的键“IdentityId”

  2. 假设角色与网络身份

    var params = {
      RoleArn: 'arn:aws:iam::xxxxxxxxxxxx:role/Cognito_xxxxxxxAuth_Role',
      RoleSessionName: 'xxxxxxxxxxx',
      WebIdentityToken: $.cookie('cognito_token'),
      DurationSeconds: 900,
      ProviderId: 'myauth'
    };
    var sts = new AWS.STS({apiVersion: '2011-06-15'});
    sts.assumeRoleWithWebIdentity(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

    // => AccessDenied:无权执行 sts:AssumeRoleWithWebIdentity

政策文件

{
"Version": "2012-10-17",
"Statement": [
  {
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
      "Federated": "cognito-identity.amazonaws.com"
    },
    "Action": "sts:AssumeRoleWithWebIdentity",
    "Condition": {
      "StringEquals": {
        "cognito-identity.amazonaws.com:aud": "us-east-1:xxxxxxxxxxxxx"
      },
      "ForAnyValue:StringLike": {
        "cognito-identity.amazonaws.com:amr": "authenticated"
      }
    }
  }
]
}
  1. 获取身份凭证

    var params = {
        IdentityId: $.cookie('cognito_identityId'),
        Logins: {
          "myauth": $.cookie('oauth.io_token')
        }
    };
    var cognitoidentity = new AWS.CognitoIdentity({apiVersion: '2014-06-30'});
    cognitoidentity.getCredentialsForIdentity(params, function(err, data) {
      if (err) {
        console.log(err, err.stack); // an error occurred
      }
      else {
        console.log(data);           // successful response
      }
    });
    

    // => InvalidParameterException: 请提供有效的公共提供者

  2. 网络身份凭证

    AWS.config.credentials = new AWS.WebIdentityCredentials({
        RoleArn: 'arn:aws:iam::xxxxxxxx:role/Cognito_xxxxxxxxxxAuth_Role',
        WebIdentityToken: $.cookie('cognito_token')
    });
    

    // => 错误:有 2 个验证错误: // * MissingRequiredParameter: 参数中缺少必需的键“IdentityPoolId” // * MissingRequiredParameter: 参数中缺少必需的键“IdentityId”

问题:

  • 我究竟做错了什么?

  • 使用这个的正确方法是什么?

谢谢。


谢谢你的好意。

我采纳了你的建议,但没有改变。

错误消息。

POST https://cognito-identity.us-east-1.amazonaws.com/ 400 (Bad Request)
POST https://cognito-identity.us-east-1.amazonaws.com/ 400 (Bad Request)
Error: Missing required key 'IdentityId' in params
    at fail (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2163:37)
    at validateStructure (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2084:14)
    at validateMember (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2110:21)
    at validate (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:2059:10)
    at Request.VALIDATE_PARAMETERS (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:800:32)
    at Request.callListeners (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:3913:20)
    at callNextListener (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:3903:12)
    at chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:787:9
    at finish (chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:126:7)
    at chrome-extension://hmjdjbikinkmjbilihjibcihbkbjdgjf/bower_components/aws-sdk-js/dist/aws-sdk.js:142:9

下面链接有源代码。

https://github.com/bisque33/my-custom-dictionary https://github.com/bisque33/my-custom-dictionary

服务器端是AWS Lambda函数。

var aws = require('aws-sdk');
aws.config.region = 'us-east-1';
var cognitoidentity = new aws.CognitoIdentity();
var identityPoolId = 'us-east-1:0dccff0d-5fd7-4d14-b38f-d27204feaecc';

console.log('Loading function');

exports.handler = function(event, context) {
    console.log('token: %s', event.token);

    var params = {
        IdentityPoolId: identityPoolId,
        Logins: {
            'oauth.io': event.token
        }
    };
    cognitoidentity.getOpenIdTokenForDeveloperIdentity(params,function(err,data){
        if(err){
            console.log(err);
            context.fail('Something went wrong');
        }else{
            context.succeed(data);
        }
    });
};

该程序是 Google-Chrome-Extension。

  • AWS Lambda 函数通过 getOpenIdTokenForDeveloperIdentity 返回令牌。
  • app/scripts/popup.js 调用 Lambda 函数并设置 cookie。
  • app/scripts/background.js 调用 AWS.config.credentials.get,并返回错误。

难道是我用错了?


更新附加信息

感谢您提供额外信息。

错误出现在background.js的第104行

AWS.config.credentials.get(function(){

和background.js上的115行

      dataset.synchronize(

而且,我的解释还不够。 Facebook 身份验证需要域名(例如 http://example.com)。但是,Google-Chrome-Ext 没有域。它有一个域“chrome-extension://xxxxxxxxxxxxxxxxxxx”。然后,我用https://oauth.io https://oauth.io。它代理任何身份验证并接受 chrome-extension 域。

Popup.js 通过 oauth.io sdk 进行 Facebook 身份验证。它获取一个 facebook 令牌,并提供给 getOpenIdTokenForDeveloperIdentity。我认为 facebook token.substr(0,14) 是独一无二的。但是,如果错误,我会使用另一个唯一标识符(例如电子邮件地址。)


对不起我错了。 AWS.config.credentials.get 给出错误:

Error: Invalid login token.

并且,dataset.synchronize 显示此错误:

Error: Missing required key 'IdentityId' in params

您使用的第一种方法是认知身份凭证 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html,很可能是您采取的最佳方法。我无法准确找出导致错误的原因,但让我们尝试以下几件事:

  1. 使用时开发者身份验证 http://docs.aws.amazon.com/cognito/devguide/identity/developer-authenticated-identities/,初始化时确实需要指定IdentityId认知身份凭证 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html。您需要通过调用 GetOpenIdTokenForDeveloperIdentity 获取 IdentityId 值。但是,您不需要将 IdentityId 值保留在 cookie 中,因为认知身份凭证 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html默认情况下会将 id 缓存在浏览器的本地存储中。
  2. 至于您的登录地图:看起来您正在尝试使用开发者身份验证 http://docs.aws.amazon.com/cognito/devguide/identity/developer-authenticated-identities/。对于 JavaScript SDK,使用密钥'cognito-identity.amazonaws.com'并确保该值是从后端调用返回的令牌getOpenIdTokenForDeveloperIdentity.

如果您在使用 CognitoIdentityCredentials 方法时仍然遇到问题,请在此处回复并提供更多信息,例如收到错误消息时您调用的确切方法/代码,以及跟踪的输出(即使用 console.log('%o ',..)) 在调用 CognitoIdentityCredentials 构造函数之前输入的参数。


根据提供的附加信息进行更新

我仍然需要确切地知道您在哪一行代码上收到错误,但根据提供的信息,我认为我仍然可以提供帮助......

根据我所看到的背景.js https://github.com/bisque33/my-custom-dictionary/blob/master/app/scripts/background.js#L31,您似乎正在尝试使用开发人员身份验证身份提供程序来初始化 CognitoIdentityCredentials。我猜测您就是在此处收到错误的。

然而,在Popup.js https://github.com/bisque33/my-custom-dictionary/blob/master/app/scripts/popup.js#L18,您似乎正在尝试使用 Facebook 验证用户身份。如果您使用 Facebook 对用户进行身份验证,则在使用 Cognito 时只需将 facebook 访问令牌传递到您的登录映射中即可。只需使用graph.facebook.com作为登录映射中的键和来自 Facebook 的访问令牌。有关如何执行此操作的更多详细信息,请参见Amazon Cognito 开发人员指南的 Facebook 集成主题 http://docs.aws.amazon.com/cognito/devguide/identity/external-providers/facebook/.

Facebook 与开发者验证身份

我们可以让开发人员验证的身份为您工作,但在这种情况下,它看起来不是适合您的解决方案,因为您实际上并未对 Lambda 函数中的身份和唯一用户标识符进行任何额外的身份验证。你正在进入getOpenIdTokenForDeveloperIdentity操作似乎是 facebook 令牌,顺便说一句,这不好,因为即使对于同一用户,令牌本身也会在用户会话之间发生变化。通常,一个好的唯一标识符是电子邮件地址或内部系统使用的用户 ID。

Facebook 登录和重定向

由于您最终尝试使用 Facebook 进行登录,而 Amazon Cognito 已Facebook 的内置集成 http://docs.aws.amazon.com/cognito/devguide/identity/external-providers/facebook/,您最好做的就是从 Facebook 获取访问令牌,并将 Facebook 令牌直接传递到 Cognito 的登录映射。我不确定这是否适用于 Auth.io(我只是不熟悉它),但只要 Auth.io 为您的 JavaScript 代码提供一个 boefide facebook 令牌,并且您将相同的 Facebook 应用程序 ID 添加到Auth.io 和 Amazon Cognito 的控制台都应该可以工作。但是,您提到您希望使用 Auth.io 来避免 Facebook 重定向到登陆页面。我可能是错的,但我很确定你是否使用Facebook 的 JavaScript SDK https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.4您不需要重定向页面。如果您这样做,您应该只需要重定向页面Facebook 的手动构建登录流程 https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Cognito - JavaScript 中的开发人员身份验证(浏览器) 的相关文章

随机推荐

  • 什么时候应该从类方法返回对对象的引用

    从类方法返回引用的最佳实践是什么 是否希望在没有引用的情况下返回基本类型 而希望通过引用返回类对象 您推荐的任何文章 最佳实践文章 我假设你所说的类方法是指成员函数 通过引用返回 的意思是 返回对成员数据的引用 这主要与返回对 local
  • Coq 中的“错误:宇宙不一致”是什么意思?

    我正在努力通过软件基础 http www cis upenn edu bcpierce sf current 目前正在做教堂数字的练习 这是自然数的类型签名 Definition nat forall X Type X gt X gt X
  • Google Finance,如何获取 JSON 数据流?

    我之前试图解释这一点 但显然失败了 因此 如果您打开了谷歌金融图表 例如 http www google com finance q INDEXNASDAQ IXIC http www google com finance q INDEXN
  • 将 HTTP 响应正文解析为 XML

    我使用此代码执行 HTTP 请求并解析 XML 响应 using HttpWebResponse resp req GetResponse as HttpWebResponse if resp StatusCode HttpStatusCo
  • R中基于移动时间窗口连接数据

    我有每小时记录一次的天气数据 以及每 4 小时记录一次的位置数据 X Y 我想知道 X Y 位置的温度是多少 天气数据并不完全相同 因此 我为每个位置编写了这个循环 以扫描天气数据 查找日期 时间中的 最接近 并提取该时间的数据 问题是我编
  • prolog 如何使用 succ 运行递归查询?

    有人可以向我解释一下为什么这个序言查询会这样工作吗 定义是 add 0 Y Y add succ X Y succ Z add X Y Z 鉴于这种 add succ succ succ 0 succ succ 0 R 这是查询的轨迹 Ca
  • 如何根据数据属性内对象的属性选择元素?

    如果我的标记如下所示 div div div div div div 如果我只有键 bar 或 foo 我将如何使用 JQuery 选择特定元素 我可以取出每一行的整个对象并迭代它以查找匹配项 但如果有更有
  • Pdfplumber 无法识别表 python [重复]

    这个问题在这里已经有答案了 我使用 Pdfplumber 提取第 2 页第 3 部分的表格 通常 但它只适用于某些 pdf 其他则不起作用 对于失败的 pdf 文件 似乎 Pdfplumber 读取的是按钮表而不是我想要的表 我怎样才能拿到
  • Windows 如何更改或插入物理扇区到另一个文件中?

    我有 20 个文件 其中数据结构在 NTFS 中与 4k 扇区对齐 我想合并所有文件无需复制任何数据 目标是编写一种通过直接更改 NTFS 虚拟集群和物理集群来工作的插入 API 目标是从 50GB 块中获得大小为 1TB 的文件 而无需复
  • 将值传递给 Sql 中的空值列

    我有一个Sections表 在该表中我有列SectionId CourseId Name Capacity 这里CourseId是一个空值列 它的外键在这里聚焦于Course表 这个CourseId列是一个新添加了一个 我正在尝试向此表添加
  • 关闭 SVG 标签,显式关闭还是自动关闭?

    我正在验证我的代码 并收到以下错误Tag cannot be self closing Use an explicit closing tag 在 IE 中作为我的 svg 路径 因为它是自动关闭的
  • 时髦的 haskell 惰性列表隐式递归

    在 Haskell 中 由于懒惰 您可以构建无限列表 Prelude gt let g 4 g Prelude gt g 0 4 Prelude gt take 10 g 4 4 4 4 4 4 4 4 4 4 现在 当我尝试构建这样的列表
  • python 中的无循环 3D 矩阵乘法

    我希望在 python numpy 中执行以下操作 Matrix A is M x N x R Matrix B is N x 1 x R 矩阵乘法 AB C 其中 C 是 M x 1 x R 矩阵 本质上 A 的每个 M x N 层 其中
  • 了解 Perl 正则表达式修饰符 /m 和 /s [重复]

    这个问题在这里已经有答案了 我一直在阅读带有修饰符 s m 和 g 的 perl 正则表达式 我知道 g 是全局匹配 它将是贪婪搜索 但我对修饰符 s 和 m 感到困惑 谁能用代码示例解释 s 和 m 之间的区别 以展示它们有何不同 我尝试
  • 如何从 MVC 控制器在 debian linux 中打印 pdf

    AsP NET MVC 4 应用程序使用 Mono 在 Debian Squeeze Linux 中运行 控制器使用下面的代码从 html 创建 pdf 文件 如何将 pdf 文件打印到连接到服务器的三星打印机 有一些可执行文件可以用于此目
  • Select2 - formatNoMatches 上的链接

    我在用着Select2 http ivaynberg github com select2 来增强我的
  • 在 Python 中验证 HTML/RDFa

    编写可以验证 HTML 尤其是使用嵌入式 RDFa 的 python 模块的最佳方法是什么 我熟悉 validator w3 org 并且有兴趣编写一个执行类似功能的自定义验证器 但针对使用 RDFa 作为元素元数据的不同标准 有哪些值得查
  • (NextAuth) 类型错误:类型“{}”上不存在属性“会话”

    我在 NextJs 项目上使用 NextAuth 时收到错误 Type error Property session does not exist on type 我正在添加session按照此处的建议将属性添加到我的 app tsx 中
  • 四组设计模式如何融入 MVC 范式?

    我仔细考虑过设计模式一段时间以来 我刚刚开始考虑如何真正开始将其中一些更有意地融入到我的开发工作中 然而 我仍然对他们在本书开头对 MVC 的处理以及它与本书其余部分的关系感到困惑 我使用过的大多数框架 Spring Yii ASP NET
  • AWS Cognito - JavaScript 中的开发人员身份验证(浏览器)

    我在浏览器脚本中获取凭据时遇到问题 身份验证服务器返回 cognito identityId 和 cognito token 然后我设置了一个Cookie cookie cognitoidentityId cookie cognito to