首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript(浏览器)中的AWS认知-开发者认证身份

JavaScript(浏览器)中的AWS认知-开发者认证身份
EN

Stack Overflow用户
提问于 2015-08-12 23:04:49
回答 1查看 6.4K关注 0票数 8

我很难在浏览器脚本中获得凭据。

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

然后我设了一个琦琦

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

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

  1. CognitoIdentityCredentials AWS.config.credentials =新AWS.CognitoIdentityCredentials({ IdentityPoolId:‘us 1:xxxxxxxxxxxx’IdentityId:$.cookie('cognito_identityId'),登录名:{ 'myauth':$.cookie('cognito_token') }}; // =>错误:在params中缺少必需的键“IdentityId”
  2. assumeRoleWithWebIdentity var params ={ 'arn:aws:iam::xxxxxxxxxxxx:role/Cognito_xxxxxxxAuth_Role',RoleSessionName:'xxxxxxxxxxx',WebIdentityToken:$.cookie('cognito_token'),DurationSeconds: 900,ProviderId:'myauth‘};var sts =新AWS.STS({apiVersion:'2011-06-15'});sts.assumeRoleWithWebIdentity(params,函数(err,data) { if (err) console.log(err,err.stack);//错误发生console.log(数据);//成功响应}; // => AccessDenied:未授权执行sts:AssumeRoleWithWebIdentity

PolicyDocument

代码语言:javascript
复制
{
"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'),登录名:{ "myauth":$.cookie('oauth.io_token') };var认知识别=新AWS.CognitoIdentity({apiVersion:'2014-06-30'});//成功的反应}); // => InvalidParameterException:请提供有效的公共提供者
  2. WebIdentityCredentials 'arn:aws:iam::xxxxxxxx:role/Cognito_xxxxxxxxxxAuth_Role',AWS.config.credentials =新AWS.WebIdentityCredentials({ RoleArn: WebIdentityToken:$.cookie('cognito_token') }); // =>错误:有两个验证错误: // * MissingRequiredParameter:在params // *MissingRequiredParameter中缺少必需的键'IdentityPoolId‘:在params中缺少必需的键'IdentityId’

问题:

  • 我做错了什么?
  • 使用这个的正确方法是什么?

谢谢。

谢谢你的好意。

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

错误信息。

代码语言:javascript
复制
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函数。

代码语言:javascript
复制
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);
        }
    });
};

这个程序是谷歌-Chrome-扩展。

  • 函数通过getOpenIdTokenForDeveloperIdentity返回令牌。
  • app/script/popup.js调用Lambda函数并设置cookie。
  • 应用程序/脚本/背景. and调用AWS.config.credentials.get,并返回错误。

我用错了吗?

补充资料的更新

感谢您提供的额外信息。

background.js上104行出现错误

代码语言:javascript
复制
AWS.config.credentials.get(function(){

和background.js上的115行

代码语言:javascript
复制
      dataset.synchronize(

而且,我的解释还不够。Facebook身份验证需要域(例如。http :// example.com)然而,没有域名.它有一个域‘chrome扩展名://xxxxxxxxxxxxxxxxxxxx’。然后,我使用https://oauth.io。它代理任何身份验证并接受铬扩展域。

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

对不起,我错了。AWS.config.credentials.get提供了一个错误:

代码语言:javascript
复制
Error: Invalid login token.

而且,dataset.synchronize显示了这个错误:

代码语言:javascript
复制
Error: Missing required key 'IdentityId' in params
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-14 19:55:24

使用CognitoIdentityCredentials的第一种方法很可能是最好的方法。我不能准确地指出是什么导致了错误,但是让我们尝试几件事情:

  1. 使用Developer Authenticated Identities时,在初始化CognitoIdentityCredentials时确实需要指定CognitoIdentityCredentials。您需要从对IdentityId的调用中获取GetOpenIdTokenForDeveloperIdentity值。但是,您不需要在cookie中保留IdentityId值,因为默认情况下,CognitoIdentityCredentials将在浏览器的本地存储中缓存id。
  2. 至于您的登录地图:看起来您正在尝试使用Developer Authenticated Identities。使用JavaScript SDK,使用键'cognito-identity.amazonaws.com'并确保值是从后端对getOpenIdTokenForDeveloperIdentity的调用返回的令牌。

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

根据所提供的补充资料更新

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

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

然而,在Popup.js中,您似乎试图使用Facebook对用户进行身份验证。如果您正在使用Facebook对用户进行身份验证,则应该将facebook访问令牌传递到您的登录地图中。只需使用graph.facebook.com作为登录地图和Facebook访问令牌中的密钥。关于如何做到这一点的更多细节,请参见Facebook Integration topic of the Amazon Cognito developer guide

Facebook与开发人员的身份验证

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

Facebook登录和重定向

既然你最终想要使用Facebook登录,而Amazon拥有built-in integration for Facebook,那么最好的方法就是从Facebook获得一个访问令牌,并将Facebook令牌直接传递到科尼图的登录地图上。我不确定这是否适用于Auth.io (我只是不熟悉它),但只要Auth.io给您的JavaScript代码一个真正的facebook令牌,并且您将相同的Facebook应用ID添加到Auth.io和Amazon的控制台中,它就应该能工作。但是,您提到您希望使用Auth.io来避免Facebook重定向到登陆页面。我可能弄错了,但我很确定如果您使用的是Facebook's JavaScript SDK,您将不需要重定向页面。只有在执行Facebook's Manually Build a Login Flow时才需要重定向页面。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31976873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档