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

时间:2015-08-12 23:04:49

标签: javascript aws-sdk amazon-cognito

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

验证服务器返回cognito_identityId和cognito_token。

然后我设置了一个Cookie:

  • $饼干。(' cognito_identityId&#39)
  • $饼干(' cognito_token&#39)

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

  1. CognitoIdentityCredentials

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

    // =>错误:缺少必需的密钥' IdentityId'在params

  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:未授权执行sts:AssumeRoleWithWebIdentity

  3. 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"
          }
        }
      }
    ]
    }
    
    1. 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:请提供有效的公共提供者

    2. WebIdentityCredentials

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

      // =>错误:有2个验证错误: // * MissingRequiredParameter:缺少必需的密钥' IdentityPoolId'在params // * MissingRequiredParameter:缺少必需的密钥' IdentityId'在params

    3. 问题:

      • 我做错了什么?

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

      谢谢。

      谢谢你的善意。

      我提出了你的建议,但没有改变。

      错误讯息。

      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函数。

      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:// xxxxxxxxxxxxxxxxxxxx'。然后,我使用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
      

1 个答案:

答案 0 :(得分:13)

使用CognitoIdentityCredentials的第一种方法很可能是您采取的最佳方法。我无法确切地发现导致错误的原因,但我们可以尝试一些事情:

  1. 使用Developer Authenticated Identities时,您需要在初始化CognitoIdentityCredentials时指定IdentityId。您需要从对GetOpenIdTokenForDeveloperIdentity的调用中获取IdentityId值。但是,您不应该在Cookie中保留IdentityId值,因为CognitoIdentityCredentials默认会将ID缓存在浏览器的本地存储中。
  2. 至于您的登录地图:您似乎正在尝试使用Developer Authenticated Identities。使用JavaScript SDK,使用密钥'cognito-identity.amazonaws.com'并确保该值是从后端调用getOpenIdTokenForDeveloperIdentity返回的令牌。
  3. 如果您仍然遇到使用CognitoIdentityCredentials方法的问题,请在此处回复一些更多信息,例如您在收到错误消息时调用的确切方法/代码,以及跟踪输出(即使用控制台)。在调用CognitoIdentityCredentials构造函数之前输入参数的日志('%o',...)。

    基于提供的附加信息进行更新

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

    根据我在background.js中看到的内容,您似乎正在尝试使用Developer Authenticated Identities提供程序初始化CognitoIdentityCredentials。这是我猜测你收到错误的地方。

    但是,在Popup.js中,您似乎正在尝试使用Facebook对用户进行身份验证。如果您使用Facebook对用户进行身份验证,则应在使用Cognito时将facebook访问令牌传递到您的登录地图中。只需使用graph.facebook.com作为登录地图中的密钥和来自Facebook的访问令牌。有关如何执行此操作的更多详细信息,请参阅Facebook Integration topic of the Amazon Cognito developer guide

    Facebook与开发者身份验证身份

    我们可以让开发人员身份验证身份为您服务,但在这种情况下,它并不适合您,因为您实际上并未对Lambda中的身份进行任何其他身份验证函数和您传递到getOpenIdTokenForDeveloperIdentity操作的唯一用户标识符似乎是facebook令牌,这是不好的,因为令牌本身将在用户会话之间改变,即使对于同一用户也是如此。通常,良好的唯一标识符是内部系统使用的电子邮件地址或用户ID。

    Facebook登录&重定向

    由于您最终尝试使用Facebook进行登录而Amazon Cognito有built-in integration for Facebook,因此您最好的办法是从Facebook获取访问令牌并将Facebook令牌传递给Cognito&#39 ; s登录地图直接。我不确定这是否适用于Auth.io(我只是不熟悉它),但只要Auth.io为您的JavaScript代码提供了一个bonefide facebook令牌并添加了相同的内容Facebook App ID同时适用于Auth.io和Amazon Cognito的控制台,它应该可以使用。但是,您提到要使用Auth.io来避免Facebook重定向到登录页面。我可能会弄错,但我很确定如果您使用Facebook's JavaScript SDK,则您不需要重定向页面。如果您正在执行Facebook's Manually Build a Login Flow,则只需要重定向页面。