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