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

标签 angularjs google-app-engine authentication cookies firebase

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

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

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

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

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

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

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

最佳答案

这是我前几天写的,也是针对GAE+AngularJS的。看看也许您可以将其应用于您的场景。

基本思想是:

1) 当用户登录时,您可以根据用户数据、时间和项目数据生成 session token ,并将其作为 cookie 发送。 (我目前使用简单的编码。如果您需要研究一些更重的加密)。

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

3)在以下请求中,您检查 cookie 是否与 header 匹配,以及(当您将它们与主 key 结合使用时)它们是否与您存储在 session 中的 token 匹配。

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()

关于angularjs - 使用 AngularJS + Firebase + Google App Engine 进行用户身份验证和授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462685/

相关文章:

angularjs - 测试指令链接功能,监视 $watch?

javascript - Angular 过滤器返回 html

ruby - 不能使用 has_secure_password,password_digest 错误

security - 在 OAuth(1.0a 和 2.0)和 Http Basic Auth

javascript - 在组合框angularjs中显示数据数组

java - IntelliJ 中的 JSTL 在 JSP 中给出错误

java - 使用 Java,如何实例化 GAE 数据存储以便它可以与 GqlQuery 结合使用?

google-app-engine - 谷歌云存储检查对象是否存在(App Engine Java)

c# - .Net Claims Auth——无法设置当前主体

javascript - 为什么我的 AngularJS 指令共享作用域?