8

我决定为我当前的 AngularJS 项目(连接到托管在 Firebase 上)使用 Fine Uploader,因为它具有许多核心功能,我需要在已经内置的上传器中使用这些功能,但是我无法理解如何使用Firebase 的电子邮件和密码与 AWS (Amazon Web Services) 通信的身份验证方法,以允许我的用户使用Fine Uploader S3上传内容。基于 Fine Uploader 博客文章Uploads without any server code,工作流程如下:

  1. 在身份提供者(例如 Google)的帮助下对您的用户进行身份验证
  2. 使用您的 ID 提供商提供的临时令牌从 AWS 获取临时访问密钥
  3. 将密钥传递给 Fine Uploader S3
  4. 您的用户现在可以上传到您的 S3 存储桶

问题是我不会使用 OAuth 2.0 (谷歌、Facebook 或亚马逊使用它来提供用户身份)来允许我的用户登录我的应用程序并上传内容。相反,我将使用 Firebase 的电子邮件和密码身份验证。

那么如何让 Firebase 的电子邮件和密码身份验证方法创建一个临时令牌以从 AWS 获取临时访问密钥并将这些密钥传递给 Fine Uploader S3 以允许我的用户将内容上传到 S3?

4

2 回答 2

2

要将 AWS 与外部应用程序连接起来,Cognito 将是一个很好的解决方案。它将允许您使用 AWS 节点开发工具包和后端中的密钥生成 OpenID 令牌,然后您可以将其与 AWS JavaScript 开发工具包和WebIdentityCredentials客户端一起使用。

请注意,我不熟悉您的特定插件/工具,但这至少可以让您获得 OpenID,并且在我的工作中它确实让我使用 连接WebIdentityCredentials,我想这是他们正在使用的。

  1. 在 AWS 上配置 Cognito

Cognito 上的设置相当简单——它或多或少是一个演练。不过,它确实涉及在 AWS 上配置 IAM 规则。如何设置这个是非常具体的项目,所以我想我需要向你指出官方资源。他们最近做了一些不错的更新,但我承认我没有跟上所有的变化。

通过配置,您将需要设置“开发人员身份验证身份”,记下“身份池 ID”以及 Cognito 设置的 IAM 角色 ARN。

  1. 设置一个可以处理传入路由的节点服务器

有很多关于如何完成此操作的材料,但您要确保包含和配置AWS 开发工具包。我还建议使用body-parser,因为它会让你的 POST 请求更容易阅读。

var app        = express();
var bodyParser = require('body-parser');
var AWS        = require('aws-sdk');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
  1. 创建 POST 函数以与 Cognito 对话

设置好服务器后,您可以使用getOpenIdTokenForDeveloperIdentity 联系Cognito 。在我的设置中,我使用经过身份验证的用户,因为我希望他们回来并希望能够继续关联,所以这就是为什么我在req.body.UserIDFromAngularApp.

这是我使用的功能express.router()

.post(function(req, res) {
   if(req.body.UserIDFromAngularApp) {
      var cognitoidentity = new AWS.CognitoIdentity();
      var params = {
         IdentityPoolId: 'your_cognito_identity_pool_id',
         Logins: {
            'your_developer_authenticated_identity_name': req.body.UserIDFromAngularApp
         }
      };
      cognitoidentity.getOpenIdTokenForDeveloperIdentity(params, function(err, data) {
         if (err) { console.log(err, err.stack); res.json({failure: 'Connection failure'}); }
         else {
            console.log(data); // so you can see your result server side
            res.json(data); // send it back
         }
      });
   }
   else { res.json({failure: 'Connection failure'}); }
});

如果一切顺利,它将返回一个 OpenID 令牌给您。然后,您可以将其返回给您的 Angular 应用程序。

  1. 来自 Angular 的 POST,从 Promise 收集

至少你需要发布到你的新节点服务器,然后从 Promise 中收集 OpenID 令牌。使用此模式,将在data.Token.

听起来您可能只需要将该令牌传递给您的插件/工具。

如果您需要进一步处理身份验证,我已经包含了处理WebIdentityCredentials.

angular.module('yourApp').factory('AWSmaker', ['$http', function($http) {
   return {
      reachCognito: function(authData) {
         $http.post('http://localhost:8888/simpleapi/aws', {
            'UserIDFromAngularApp': authData.uid,
         })
         .success(function(data, status, headers, config) {
            if(!data.failure) {
               var params = {
                  RoleArn: your_role_arn_setup_by_cognito,
                  WebIdentityToken: data.Token
               };
               AWS.config.credentials = new AWS.WebIdentityCredentials(params, function(err) {
                  console.log(err, err.stack);
               });
            }
         });
      }
}]);

这应该让你上路。让我知道我是否可以提供进一步的帮助。

于 2015-02-17T20:34:07.793 回答
0

每个 OAuth 提供者都有一种稍微独特的处理方式,因此您的 Firebase 身份验证令牌中可用的属性会因提供者而略有不同。例如,在使用 Facebook 时,Facebook 身份验证令牌存储在facebook.accessToken返回的用户对象中:

var ref = new Firebase(URL);
ref.authWithOAuthPopup("facebook", function(error, authData) {
  if (authData) {
    // the access token for Facebook
    console.log(authData.facebook.accessToken);
  }
}, {
  scope: "email" // the permissions requested
});

所有这些都包含在Web 指南的用户身份验证部分中

于 2014-10-13T17:38:07.787 回答