5

我正在开发一个允许用户使用simpleauth进行身份验证的 webapp 。现在我将支持 Google 和 Facebook。除了登录和注销(使用 webapp2),webapp 将包含 Cloud Endpoint API。客户端将是 Web、Android 和 iOS。

我的问题是,使用 Endpoints Proto Datastore,如果用户的身份验证提供程序是 Facebook(或任何其他受支持的 OAuth2 提供程序),我是否可以拥有user_required=True并调用endpoints.get_current_user()以获取我的用户@Model.method?如果不可能,这是否意味着我不应该拥有user_required=True,而是应该从给定 OAuth2 令牌的提供者那里获取永久用户 ID 并将其保存在数据存储区中,为该用户生成我自己的身份验证令牌,然后将该令牌传递给每个请求?

编辑:不是传递身份验证令牌,而是让经过身份验证的用户请求他们可以传递给 API 方法的“API 令牌”是否有意义?这个令牌是否必须包含在 POST 或 GET 正文中,还是可以放在标头/cookie 中(我在 SO 的其他地方看到了一些关于 Cloud Endpoints 的标头和 cookie 的问题,但从那时起已经有一段时间了)。这一切都假设非谷歌身份验证不起作用。

4

1 回答 1

2

此答案不会直接回答您的问题,但应该让您很好地了解如何以安全的方式实施身份验证。我最近实现了类似的东西,并花了相当长的时间找出使用 Google AppEngine 环境进行身份验证的最佳方法。

Google 支持 OpenId Connect 协议。根据Getting Started with OAuth 2.0 book ,Facebook 的实现应该非常相似。我将更多地关注 Google 的实现,因为我对它更熟悉,但是在使用其他 OAuth 提供程序时,这些概念应该非常相似。

id_token成功验证用户身份后,OpenId Connect 会给您一个,。它还会给你一个access token. 访问令牌是应该保密的东西. 切勿通过电线发送。另一方面,ID 令牌非常方便。它包含有关您的用户的一些信息,并且已加密,因此不会“像那样”公开有关用户的任何信息。您必须破解 id_token 才能找到有关用户的任何信息。万一它被破解,它不会暴露任何关于用户的关键信息。您可以做什么,您可以将其存储为 cookie,然后在所有后续请求中使用它,通过检查是否存在与 id_token 匹配的访问令牌来验证用户。唯一的缺点是 id_token 很长——大约需要 650 字节。这意味着每个 http 请求都携带该有效负载。如果发送这么多信息对于您的用例来说太多了,您可以只发送前几个字符,也许 12 左右,然后只匹配第一部分。id_token 在分析数据时也很有用。它会在分析 http 请求时显示,但不会显示有关用户的任何信息,您仍然可以区分来自不同用户的请求。

另外请注意,不要尝试使用 AppEngine 的用户服务,因为它不适用于任何类型的自定义身份验证。

希望这能给你一个想法,让你走上正轨。

于 2014-01-06T00:49:12.910 回答