用户身份验证&使用AngularJS + Firebase + Google App Engine进行授权

时间:2014-05-04 23:21:02

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

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

简而言之,我正在AngularJS中开发一个简单的Web应用程序,并使用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使用用户的Google帐户进行身份验证的选项。我希望用户能够使用他们拥有的任何电子邮件和他们想要的任何密码进行注册。

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

最后,我的问题归结为:我们假设我使用Firebase的SimpleLogin对用户进行身份验证,并使用FireBase的SimpleLogin中的身份验证令牌来存储用户是否已登录。我可以& #39;使用该令牌来强制我的数据存储(Google App Engine)的安全性,对吧?

1 个答案:

答案 0 :(得分:2)

这是我几天前写的,也是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()