我正在开发一个主要通过应用程序访问的网站,我想使用OAuth2进行用户注册和身份validation。 由于它是一个Android应用程序,我将开始使用Google的OAuth2的东西,因为它在Android上提供了一个体面的用户界面。 Google表示: “您可以select使用Google的身份validation系统作为为您的应用程序外包用户身份validation的方式,这可以消除创build,维护和保护用户名和密码存储的需要。 这是我想要做的。 但是,当我浏览所有的示例和其他内容时,我只能find有关网站或应用程序对Google服务进行身份validation的信息。 事实上,当我使用Google的OAuth2注册我的应用程序(“客户端”)时,网站客户端和“已安装”客户端(即移动应用程序)可以select,但不能同时使用。 我可以创build两个独立的客户端,但是我阅读了OAuth2草案,我认为会有一个问题,现在我将解释。 以下是我设想的工作原理: 用户要求MyApp访问他的私人数据。 应用程序使用Android的AccountManager类为Google的API请求访问令牌。 Android对用户说:“应用程序'MyApp'想要访问Google上的基本信息,这样好吗? 用户说是的。 AccountManager使用存储在手机上的凭证连接到Google的OAuth2服务器,并要求提供访问令牌。 访问令牌(跟随绿线)被返回。 AccountManager将访问令牌返回给MyApp。 MyApp向MySite发送一个请求给用户的私有数据,包括访问令牌。 MySite需要使用访问令牌来validation用户。 它按照这里描述的那样validation令牌,用Google – “Google,这个令牌是否有效?”。 现在,我想要发生的是,Google说:“是的,谁给了你的就是这个用户”,但是我认为实际发生的事情(基于OAuth2草案和Google的文档)是:这个标记只对MyApp有效,而你是MySite。GTFO!“。 那我该怎么做呢? 并请不要说“使用OpenID”或“不要使用OAuth2”或其他类似的无益的答案。 哦,我真的想继续使用好的AccountManager UI而不是蹩脚的popupWebView 编辑 暂时的答案(我会报告,如果它的工作!)从尼古拉是它应该实际上工作,谷歌的服务器将不关心访问令牌来自哪里。 似乎有点不安全,但我会看看它是否有效! 更新 我用Facebook而不是Google实现了这个模式,它完全可以工作。 OAuth2服务器不关心访问令牌来自哪里。 至lessFacebook的不,所以我认为谷歌也不会。 鉴于此,存储访问令牌是一个非常糟糕的主意! 但是我们也不希望打开Facebook / Google的服务器来检查每个请求的身份validation,因为它会减慢一切。 可能最好的办法是为您的站点添加一个额外的身份validationcookie,当您的访问令牌经过validation时,您可以发出一个额外的身份validationCookie,但更简单的方法就是将访问令牌视为密码并存储其密码。 因为访问令牌真的很长,所以你不需要去加盐。 所以上面的步骤就像这样: 9. MySite需要使用访问令牌来validation用户。 首先它检查散列的有效访问令牌的caching。 如果发现令牌的散列,它知道用户被authentication。 否则,按照Google的说明与Google进行核对 – “Google,这个标记是否有效?”。 10.如果Google说访问令牌是无效的,我们告诉用户GTFO。 否则Google会说“是的,这是一个有效的用户”,然后我们检查我们的注册用户数据库。 如果没有find该Google用户名(或使用Facebook的Facebook用户名),我们可以创build一个新用户。 然后我们caching访问令牌的哈希值。
我如何validationGoogle身份validation访问令牌? 我需要以某种方式查询Google并询问:[给定访问令牌]对于[example@example.com] Google帐户是否有效? 简短版本 : 很明显,如何使用通过Google身份validationAPI :: OAuth身份validationWeb应用程序提供的访问令牌,然后从一系列Google服务请求数据。 目前还不清楚如何检查给定的访问令牌对于给定的Google帐户是否有效。 我想知道如何。 长版本 : 我正在开发一个使用基于令牌的身份validation的API。 在提供有效的用户名+密码或从N个可validation服务中的任何一个提供第三方令牌时,将返回令牌。 其中一项第三方服务是Google,允许用户使用他们的Google帐户对我的服务进行身份validation。 这将在以后扩展到包括雅虎帐户,可信的OpenID提供商等。 基于Google的访问示意图示例: 替代文字http://webignition.nethttp://img.dovov.comfigures/auth_figure002.png 'API'实体完全在我的控制之下。 “公共界面”实体是任何基于networking或桌面的应用程序。 一些公共接口在我的控制之下,其他的则不在,而其他的我可能从来不知道。 因此,我无法相信在步骤3中提供给API的令牌。这将随相应的Google帐户电子邮件地址一起提供。 我需要以某种方式查询谷歌,并问: 这个访问令牌是有效的example@example.com ? 在这种情况下,example@example.com是Google帐户的唯一标识符 – 用户用于login其Google帐户的电子邮件地址。 这不能被认为是一个Gmail地址 – 有人可以有一个谷歌帐户,没有一个Gmail帐户。 Google文档清楚地说明了如何使用访问令牌从多个Google服务中检索数据。 没有什么似乎说明如何检查一个给定的访问令牌是否有效。 更新该令牌对N个Google服务有效。 我无法尝试使用Google服务的令牌作为validation方式,因为我不知道给定用户实际使用的所有Google服务的哪个子集。 此外,我永远不会使用Google身份validation访问令牌来访问任何Google服务,只是作为validation所谓的Google用户实际上是他们所说的人的手段。 如果还有其他的方法,我很乐意尝试。
我正在使用的示例将OAuth请求中的作用域指定为:scope = https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email + https%3A%2F%2Fwww.googleapis.com%2Fauth% 2Fuserinfo.profile 解码为两个URI: https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile 我无法find涵盖可用范围的完整列表以及每个范围内可访问哪些信息的文档 – 有谁知道这样的事情是否存在?