google-app-engine - 具有 AppEngine、Webapp2 和 Cloud Endpoints Proto Datastore 的多个 Auth Provider

标签 google-app-engine oauth-2.0 google-cloud-endpoints endpoints-proto-datastore gae-userservice

我正在开发一个允许用户使用 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/

相关文章:

python - 处理缓存页面中的 oauth_required

java - AppEngine 和 session

asp.net-web-api - 前缀 OAuth 属性 ?即作为 :client_id

node.js - 使用 Google Cloud 端点进行 API 身份验证

java - 保证GAE中任务只添加到推送队列一次

google-app-engine - Google App Engine 自定义域未激活 Google 管理的 SSL

oauth-2.0 - IdentityServer3 OAuth2 LinkedIn 外部登录返回访问被拒绝

oauth-2.0 - 在通过 client_credentials 授予请求的 token 中返回 Azure AD 应用程序角色

java - App Engine 数据存储到 Android ListView

javascript - Google Cloud Endpoints 和 javascript 客户端停止工作