2

我对Web开发相对比较陌生,所以如果这个问题有点基础,我很抱歉。我一直在研究过去3小时内如何解决这个我认为很常见的问题。但是,因为我不是专家,所以我无法判断我的理解是否正确。使用AngularJS + Firebase + Google App Engine进行用户认证和授权

总之,我正在AngularJS中开发一个简单的Web应用程序,并使用Google App Engine作为我的数据存储。我调动了使用Firebase作为我的数据存储的想法,但我强烈关注某些Google App Engine功能(主要是查询功能)。

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

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

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

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

最终,我的问题归结为:假设我使用Firebase的SimpleLogin对用户进行身份验证,并使用FireBase的SimpleLogin中的身份验证令牌来存储用户是否已登录。我无法使用该令牌对我的数据执行安全性商店(Google App Engine),对吧?

回答

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

嘿,角边是怎么样的?你在添加头文件吗?你能举个例子吗?非常感谢! – ADL

相关问题