Javascript 如何使用SAML将AWS Cognito连接到远程Shibboleth安装?

Javascript 如何使用SAML将AWS Cognito连接到远程Shibboleth安装?,javascript,amazon-web-services,saml,amazon-cognito,shibboleth,Javascript,Amazon Web Services,Saml,Amazon Cognito,Shibboleth,免责声明:我不太熟悉Shibboleth或其他认证系统或AWS Cognito的工作原理,因此对于任何能提供帮助的人,请简单解释一下 我的公司最近在AWS上运行了我们产品的云版本,我们现在想使用AWS Cognito和SAML连接到远程Shibboleth系统,以验证登录到我们云系统的用户。Shibboleth系统位于客户机构的远程位置 到目前为止,我已经做了以下工作(我不知道这些是否正确): 在AWS中,我创建了SAML类型的IAM标识提供程序。我从客户的IT部门收到一个SAML.xml文件,

免责声明:我不太熟悉Shibboleth或其他认证系统或AWS Cognito的工作原理,因此对于任何能提供帮助的人,请简单解释一下

我的公司最近在AWS上运行了我们产品的云版本,我们现在想使用AWS Cognito和SAML连接到远程Shibboleth系统,以验证登录到我们云系统的用户。Shibboleth系统位于客户机构的远程位置

到目前为止,我已经做了以下工作(我不知道这些是否正确):

  • 在AWS中,我创建了SAML类型的IAM标识提供程序。我从客户的IT部门收到一个
    SAML.xml
    文件,我将其连接到IAM身份提供商。这似乎没问题
  • 当我设置IAM身份提供程序时,AWS自动创建了Cognito Auth和Unauth角色,我保留了默认策略
  • 我为客户机构设置了一个新的联合身份。我还将创建的IAM标识提供程序链接到此联合标识
  • 创建联邦身份后,我被带到AWS中的示例代码页面,在那里我需要选择用于建立连接的SDK等。我还从AWS获得了一个身份池ID。我选择使用JavaScript SDK,因此我下载了JSSDK以及GitHub上另一个推荐的库,名为
    amazon cognito JS master
  • 我在一个新的HTML文件中包含了必要的JS脚本,然后将下面的JS代码放入该文件中(带有有效的标识池ID)
  • 当我运行脚本时,我似乎从
    console.log
    语句中返回了一个有效的
    syncClient
    对象,但是从那里,我不知道该做什么
  • 基本上,在这一点上,我必须做什么才能从我们的JS脚本向远程Shibboleth系统发出请求以验证用户

    在我发出
    AWS.CognitoSyncManager
    请求之前,我是否需要拥有可用的用户凭据(即用户名和密码),或者在此之前是否需要进行某种级别的初始化?是否需要客户机构/IT部门提供其他信息/文件来完成此设置

    我对此知之甚少,甚至不知道该问什么问题。如有任何帮助/指导,将不胜感激

    请注意,我已经详细阅读了AWS文档,但我无法理解他们所说的内容(我不是认证专家)。多谢各位

    var IdentityPoolId = 'us-east-2:45679821-9064-45f8-12ac-456132abc789'; // Not a real ID.
    
    // Initialize the Amazon Cognito credentials provider
    AWS.config.region = 'us-east-2'; // Region
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: IdentityPoolId,
    });
    
    // Initialize the Cognito Sync client
    
    AWS.config.credentials.get(function(){
    
      var syncClient = new AWS.CognitoSyncManager();
    
      console.log(syncClient);
    
      syncClient.openOrCreateDataset('myDataset', function(err, dataset) {
    
        dataset.put('myKey', 'myValue', function(err, record){
    
          dataset.synchronize({
    
            onSuccess: function(data, newRecords) {
              // Your handler code here
            }
    
          });
    
        });
    
      });
    
    });
    
    • 基本上,此时我需要做什么才能从我们的JS脚本向远程Shibboleth系统发出请求,以验证用户身份?
      嗯,你不能。当使用联邦身份时,您需要编写自己的代码来显示登录UI,或者重定向到第三方IDP(如Shibboleth)的登录页面,或者使用他们的SDK。最终,您需要编写自己的代码,而不需要任何AWS SDK来获取OpenID令牌或SAML断言。当您获得令牌或SAML断言时,在初始化CognitoIdentityCredentials时在登录映射中使用它。参见示例。有一个登录字段,您需要在其中传递从IdP接收的令牌或断言。现在,只要映射中的SAML断言有效,您就可以获得临时AWS凭据&您的AWS调用将成功。当使用联邦身份时,登录映射中的这一行是Cognito和类似Idp的Shibboleth之间的唯一交互。您不能使用用户名和密码直接从Cognito Federated Identifications调用Shibboleth以获取有效的令牌或响应

    • 但如果我想构建一个需要使用Shibboleth进行身份验证的应用程序或服务,该怎么办呢。理想情况下,如果用户没有登录,我会看到一个UI,它会将我重定向到Shibboleth,在那里我可以输入用户名和密码。课后,应使用有效凭据将我重定向到我的应用程序/服务。
      这也可以做到,但要使用Cognito用户池,而不是联合身份。将SAML提供程序添加到用户池(请参阅)。在此之后,将Userpool添加到您的标识池(联邦标识)。现在使用Userpool的内置UI登录并获取Id令牌(而不是SAML断言,用户-->Userpool内置UI-->Shibboleth-->用户名+密码登录-->Shibboleth向Cognito Userpool发送SAML断言-->Userpool发出令牌)。在CognitoIdentityCredentials的登录映射中使用此Id标记


    Userpool是身份提供者(IdP)。您可以使用它注册/管理用户,还可以用于登录。联合身份(Identity Pool或简称Id Pool)使用各种IDP,并可用于获取临时凭据。用户池用于身份验证;用于授权的标识池。Userpool用于登录用户并获取令牌。Id池使用令牌作为输入并提供临时AWS凭据。Id池没有任何用户概念。我知道你提到你已经看过文档了。我建议你找一个精通身份验证的人帮忙,因为这是任何应用程序的关键部分。你确实需要使用你的IdPs登录页面登录你的用户。这就像使用谷歌/Facebook登录一样。当你点击这些按钮时,你会被重定向到他们的网站。你的Idp提供的SAML文件确实有你需要的一切。令牌用于验证您是否经过身份验证。与服务器端lang(如PHP)不同,在PHP中,您可以在登录后使用会话,基于javascript的应用程序需要其他方式来验证用户是否登录,即他们是否拥有有效的会话。这是使用JWT令牌完成的,JWT令牌以编码格式包含相关声明,如电子邮件、用户ID等以及签名。再一次,我建议根据您的用例(仅使用身份验证&仅使用Shibboleth),寻求精通这些内容的人的帮助,我看不到poi