【问题标题】:User authentication & authorization using AngularJS + Firebase + Google App Engine使用 AngularJS + Firebase + Google App Engine 的用户身份验证和授权
【发布时间】:2014-06-21 04:15:01
【问题描述】:

我对网络开发比较陌生,所以如果这个问题有点基础,我深表歉意。在过去的 3 个小时里,我一直在研究如何解决这个我认为很常见的问题。但是,由于我不是专家,我无法判断我的理解是否正确。

简而言之,我正在使用 AngularJS 开发一个简单的网络应用程序,并使用 Google App Engine 作为我的数据存储。我曾想过将 Firebase 用作我的数据存储,但我非常喜欢 Google App Engine 的某些功能(主要是查询能力)。

本质上,我的网站将拥有用户。用户可以创建项目。用户可以授予其他用户对其项目的访问权限。对于给定的项目(具有给定的 projectID),只有某些用户应该能够访问它。因此,对 /rest/projects/[projectID] 的 http.$get 请求应该只能由项目中具有该 projectID 的用户访问。

从概念上讲,根据我的阅读理解,理想的情况是,如果我在 Google App Engine 中有一个用户登录系统,在登录时会发回会话令牌或 cookie。然后,每当我从 AngularJS 向服务器发出请求时,我都会通过 HTTP 标头发送这个令牌/cookie。然后,我的服务器可以解析这个 cookie 以了解它是什么用户,并从中确定用户是否应该有权访问特定项目。

Google App Engine 似乎没有允许自定义电子邮件/密码的身份验证系统;换句话说,我不想使用 App Engine 的使用用户的谷歌帐户进行身份验证的选项。我希望用户能够使用他们拥有的任何电子邮件和他们想要的任何密码进行注册。

事实证明,Firebase 有一个 SimpleLogin 模块,我可以轻松实现它。但是,我从 Firebase 收到的身份验证令牌并不能真正用于在 Google App Engine 上实现安全性,对吗?

最终我的问题归结为:假设我使用 Firebase 的 SimpleLogin 对用户进行身份验证,并使用 FireBase 的 SimpleLogin 中的身份验证令牌来存储用户是否已登录。我无法使用该令牌来强制我的数据存储的安全性(谷歌应用引擎),对吧?

【问题讨论】:

    标签: angularjs google-app-engine authentication cookies firebase


    【解决方案1】:

    这是我几天前写的,也是为 GAE+AngularJS 写的。看看也许你可以在你的场景中采用它。

    基本思路是:

    1) 当用户登录时,您会根据用户数据、时间和项目数据生成会话令牌,并将其作为 cookie 发送。 (我目前正在使用简单的编码。如果您需要查看一些更重的加密)。

    2) 您将该 cookie 与您的主密钥结合起来,并将其保存在服务器会话中。

    3) 在以下请求中,您检查 cookie 是否与标头匹配,以及(当您将它们与主密钥组合时)它们是否与您存储在会话中的令牌匹配。

    4) 如果不匹配,拒绝访问

    完全披露:我不是任何类型的安全或优化专家,所以我不知道这是否是一个好的解决方案,它。这是我从各种网上资料中推导出来的,还没有测试过,所以请谨慎使用(;

    class Handler( webapp2.RequestHandler ):
      @property
      def verified( self ):
        if not self.user: _verified = False
        else:
          _verified = False
          _cookie = self.request.cookies.get( 'XSRF-TOKEN' )
          _header = self.request.headers.get( 'X-XSRF-TOKEN' )
    
          if _header == _cookie and self.token == hashlib.sha1(
                      str( _header ) + '::' + MASTER_KEY ).hexdigest( ): _verified = True
        return _verified
    
      @webapp2.cached_property
      def token( self ):
        def generate_session_token( value ):
          user_hash = hashlib.sha1( value ).hexdigest( )
          time_hash = hashlib.sha1( '%s' % time.mktime( datetime.now( ).timetuple( ) ) ).hexdigest( )
          app_hash = hashlib.sha1( PROJECT ).hexdigest( )
          return hashlib.sha1( app_hash + '::' + user_hash + '::' + time_hash ).hexdigest( )
    
        if 'XSRF-TOKEN' not in self.session:
          _token = generate_session_token( self.user )
          self.session.update( { 'XSRF-TOKEN': hashlib.sha1( _token + '::' + MASTER_KEY ).hexdigest( ) } )
        return self.session.get( 'XSRF-TOKEN' )
    
      def login_callback( self, provider ):
        if provider == 'admin':
          self.response.set_cookie( 'XSRF-TOKEN', self.token )
          self.redirect( '/' )
    
      def get(self):
        if not self.verified: self.error( 401 )
        else:
          self.displayProject()
    

    【讨论】:

    • 你好,有棱角的一面是什么样子的?您是否在该标题中添加?你能举个例子吗?非常感谢!
    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多