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