我正在开发一个允许用户使用 simpleauth 进行身份验证的网络应用程序.现在我将支持谷歌和 Facebook。除了登录和注销(使用 webapp2)之外,webapp 将包含 Cloud Endpoint API。客户端将是 Web、Android 和 iOS。
我的问题是,使用 Endpoints Proto Datastore,我能否拥有 user_required=True
并调用 endpoints.get_current_user()
从 @Model 获取我的用户.method
如果用户的身份验证提供商是 Facebook(或任何其他受支持的 OAuth2 提供商?如果不可能,这是否意味着我不应该有 user_required=True
,而应该从提供者处获取 OAuth2 token 的永久用户 ID 并将其保存在数据存储中,为该用户生成我自己的身份验证 token ,然后将该 token 传递给每个请求?
编辑:与其传递授权 token ,让经过身份验证的用户请求他们可以传递给 API 方法的“API token ”是否有意义?这个 token 是否必须包含在 POST 或 GET 正文中,还是可以放在 header /cookie 中(我在 SO 的其他地方看到了一些关于带有云端点的 header 和 cookie 的问题,但从那以后已经有一段时间了)。这一切都假设非 Google 身份验证不起作用。
最佳答案
此答案不会直接回答您的问题,但应该让您了解如何以安全的方式实现身份验证。我最近实现了类似的东西,并花了很多时间弄清楚哪种是使用 Google AppEngine 环境进行身份验证的最佳方式。
Google 支持 OpenId Connect 协议(protocol)。根据Getting Started with OAuth 2.0,Facebook 的实现应该非常相似。书。我将更多地关注 Google 的实现,因为我对它更熟悉,但在使用其他 OAuth 提供程序时概念应该非常相似。
OpenId Connect 会给你一个 id_token
,在成功验证用户之后。它还将为您提供一个访问 token
。访问 token 是应该保持 secret 的东西。切勿通过电线发送。另一方面,ID token 非常方便。它包含有关您的用户的一些信息,并且已加密,因此不会“像那样”公开有关用户的任何信息。您必须破解 id_token 才能找到有关用户的任何信息。万一它被破解,它不会暴露任何关于用户的关键信息。你可以做什么,你可以将它存储为 cookie,然后在所有后续请求中使用它来通过检查是否存在与 id_token 匹配的访问 token 来验证用户。唯一的缺点是 id_token 很长——大约需要 650 字节。这意味着每个 http 请求都携带该有效负载。如果发送这么多信息对您的用例来说太多了,您可以只发送前几个字符,可能是 12 个左右,然后只匹配第一部分。 id_token 在分析数据时也很有用。它会在分析 http 请求时显示,但不会透露有关用户的任何信息,您仍然可以区分来自不同用户的请求。
另请注意,不要尝试使用 AppEngine 的用户服务,因为它不能很好地处理任何类型的自定义身份验证。
希望这能给你一个想法,让你走上正确的轨道。
关于google-app-engine - 具有 AppEngine、Webapp2 和 Cloud Endpoints Proto Datastore 的多个 Auth Provider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20794318/