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

AWS Cognito - Developer Authenticated Identities in JavaScript(Browser)

本文关键字:身份验证 浏览器 开发者 Cognito JavaScript AWS      更新时间:2023-09-26

我在浏览器脚本中无法获得凭据。

认证服务器返回cognito_identityId和cognito_token。

然后我设置一个Cookie:

  • .cookie美元(cognito_identityId)
  • .cookie美元(cognito_token)

我尝试在浏览器上以4种方式获取凭据,但都失败了:

  1. CognitoIdentityCredentials

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

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

  2. assumeRoleWithWebIdentity

    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: Not authorized to perform sts: presumerolewithwebidentity

PolicyDocument

{
"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"
      }
    }
  }
]
}
  • GetCredentialsForIdentity

    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: Please提供一个有效的公共提供者

  • WebIdentityCredentials

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

    //=> Error:有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

    和服务器端是一个AWS Lambda Function。

    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/pop .js调用Lambda Function并设置cookie。
    • app/scripts/background.js调用AWS.config.credentials。

    我用错了吗?


    更新附加信息

    感谢您提供的额外信息。

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

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

    and 115 line on background.js

          dataset.synchronize(
    

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

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


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

    Error: Invalid login token.
    

    ,数据集。同步显示此错误:

    Error: Missing required key 'IdentityId' in params
    

    第一种方法是使用CognitoIdentityCredentials,这可能是最适合您的方法。我不能准确地指出是什么导致了你的错误,但让我们尝试一些事情:

    1. 当使用开发者身份验证时,你需要在初始化CognitoIdentityCredentials时指定IdentityId。您需要从对GetOpenIdTokenForDeveloperIdentity的调用中获取IdentityId值。然而,你不需要在cookie中保留IdentityId值,因为CognitoIdentityCredentials默认情况下会在浏览器的本地存储中缓存id。
    2. 至于你的登录地图:看起来你正在尝试使用开发者身份验证。使用JavaScript SDK,使用密钥'cognito-identity.amazonaws.com'并确保该值是后端调用getOpenIdTokenForDeveloperIdentity返回的令牌。

    如果你继续使用CognitoIdentityCredentials方法有问题,请在这里回复一些更多的信息,如你收到错误消息时调用的确切方法/代码,以及在调用CognitoIdentityCredentials构造函数之前输入的参数的跟踪输出(即console.log('%o',…))。


    根据提供的附加信息更新

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

    根据我在background.js中看到的,看起来你正在尝试使用开发者身份验证提供者初始化CognitoIdentityCredentials。这是我猜你收到错误的地方。

    然而,在Popup.js中,看起来你正在尝试与Facebook验证用户。如果您使用Facebook对用户进行身份验证,则在使用Cognito时只需将Facebook访问令牌传递到登录地图中。只需使用graph.facebook.com作为登录地图和访问令牌从Facebook的关键。关于如何做到这一点的更多细节,请参阅Amazon Cognito开发者指南的Facebook Integration主题。

    Facebook vs开发者身份验证

    我们可以让开发者身份验证为您工作,但在这种情况下,它看起来不像你的正确的解决方案,因为你实际上没有做任何额外的身份验证在你的Lambda函数和唯一的用户标识符,你传递到getOpenIdTokenForDeveloperIdentity操作似乎是facebook令牌,这是不好的,因为令牌本身会改变用户会话之间,甚至为同一用户。通常,一个好的唯一标识符是内部系统使用的电子邮件地址或用户id。

    Facebook登录&重定向

    由于您最终试图使用Facebook登录,Amazon Cognito内置了Facebook集成,最好的事情是从Facebook获取访问令牌,并将Facebook令牌直接传递到Cognito的登录地图。我不确定这对奥斯是否有效。(我只是不熟悉它),但只要Auth。io给你的JavaScript代码一个真正的facebook令牌,你添加相同的facebook应用程序ID到两个Auth。io和Amazon Cognito的控制台,它应该可以工作。但是,您提到要使用Auth。避免Facebook重定向到登陆页面。我可能是错的,但我很确定,如果你使用Facebook的JavaScript SDK,你不需要重定向页面。你应该只需要重定向页面,如果你正在做Facebook的手动建立一个登录流程。