Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用webapp2会话的Google云端点身份验证_Python_Google App Engine_Oauth 2.0_Google Cloud Endpoints_Webapp2 - Fatal编程技术网

Python 使用webapp2会话的Google云端点身份验证

Python 使用webapp2会话的Google云端点身份验证,python,google-app-engine,oauth-2.0,google-cloud-endpoints,webapp2,Python,Google App Engine,Oauth 2.0,Google Cloud Endpoints,Webapp2,我的Google Cloud Endpoints API的客户端是一个JavaScript(AngularJS)web应用程序,托管在与Endpoints API本身相同的Google应用程序引擎应用程序上。我的用户使用(数据存储)进行身份验证。他们不一定有谷歌账户。我希望能够向端点API发出请求,如/API/users/me,该请求将返回当前登录用户的用户数据 首先,我认为我必须为我的应用程序引擎应用程序实现一个OAuth2提供程序,然后让AngularJS应用程序从我自己的应用程序引擎OAu

我的Google Cloud Endpoints API的客户端是一个JavaScript(AngularJS)web应用程序,托管在与Endpoints API本身相同的Google应用程序引擎应用程序上。我的用户使用(数据存储)进行身份验证。他们不一定有谷歌账户。我希望能够向端点API发出请求,如
/API/users/me
,该请求将返回当前登录用户的用户数据

首先,我认为我必须为我的应用程序引擎应用程序实现一个OAuth2提供程序,然后让AngularJS应用程序从我自己的应用程序引擎OAuth提供程序请求一个OAuth2访问令牌(而不是像内置身份验证机制那样由Google的OAuth提供程序)

但是,建议不要实现我自己的OAuth2提供程序,而是在我的请求中(在消息字段或HTTP头中)向端点API提供任意参数。我猜这个参数应该是一个用户令牌(一些登录用户特有的加密值?)。然后应将该值传递给浏览器。这不是很不安全吗?如果可能的话,我不想在HTTPS上提供我的AngularJS应用程序(以节省成本)

这是OAuth2的一个好用例吗?或者OAuth2仅用于授予第三方应用程序访问用户数据的权限


如果OAuth2不是解决方案:如何将用户令牌安全地传递给浏览器并防止中间人攻击?用户令牌是否应该在一段时间后过期?

我刚刚完全实现了您所描述的功能。基本上,这种方法实现了以下目的:

def get_current_session(request_state):
    cookies = werkzeug.http.parse_cookie(request_state.headers.get('Cookie'))
    sess_cookie = cookies.get('mc_session')
    parts = sess_cookie.split('|')
    if len(parts) != 3:
        logging.error('Cookie does not have 3 parts')
        return False

    signature = hmac.new(COOKIE_SECRET_KEY, digestmod=hashlib.sha1)
    signature.update('|'.join(parts))
    sig_hex = signature.hexdigest()
    if compare_hashes(sig_hex, parts[2]):
        logging.error('Cookie signature mismatch!')
        return False

    cookie_data = webapp2_extras.json.b64decode(parts[0])
    return sessions_ndb.Session.get_by_sid(cookie_data['_sid'])
您可以使用以下API方法调用该函数:

session = get_current_session(self.request_state)

您可以在以下网址找到所有详细信息:

为了进一步澄清我的其他评论,我不建议您使用自己的身份验证。这样做将充满问题。当我提到传递auth参数时,我指的是其他提供商(如Twitter或Facebook)给你一个标识用户的令牌。在大多数情况下,这些值可以通过HTTPS安全地传递到浏览器。大多数用户将拥有一个或多个Facebook/Twitter/Yahoo/Google/(插入其他大型身份提供商)帐户,因此,让这些公司来处理身份验证几乎总是一个更好的主意。目前,我的应用程序使用联合登录和类似的方式来处理身份验证。用户可以使用Facebook或Google帐户或用户名/密码组合登录。因此,也许我不应该再支持用户名/密码(尽管出于隐私原因,我认为许多人并不急于使用他们的Facebook或Google帐户登录网站)。如果我通过HTTPS为AngularJS应用程序提供服务,那么我应该传递类似于
{'provider':'facebook',access_token':'token'}
的信息来识别请求端点API的用户?是的,这是正确的。如果您不想放弃用户名/密码身份验证,您可以在用户登录时通过构造令牌来执行类似的操作。令牌必须有一个到期日,否则它等同于密码(您不应该在请求和URL中传递密码)。但是如果令牌到期,我还需要提供某种刷新令牌。那么这不就是实现OAuth2提供程序吗?为什么要构造类似于OAuth2的东西而不是实现OAuth2?谢谢你的帮助,我真的很感激!或者,您可以保持令牌生命周期较小(比如5分钟),继续提供新的令牌生命周期,并使旧的令牌生命周期无效。不过,确保正确操作是很重要的,这也是为什么我仍然认为最好还是听从那些将提供身份认证作为一项业务的公司。