刚刚实现了这个,我有一个关于身份验证和 oauth 如何协同工作的非常基本的问题。我有一个示例 Web 应用程序客户端 (ckclient),它访问 REST API (commitapi) 来管理他们的承诺。这遵循了类似 LinkedIn 的应用程序显示用户的推文(通过 Twitter)的模型,如下所述:http ://www.slideshare.net/coldfumonkeh/oauth-demystified-hopefully
在我的简单应用程序中,用户访问 Web 应用程序客户端并要求查看他们的承诺。我正在使用 Restlet,用户被重定向到一个页面,他们可以在其中选择他们的 OpenId 提供程序并登录。他们被重定向到可以批准访问其承诺资源的页面。一切正常。
但是,Web 应用程序客户端不知道用户是谁!所有身份验证都是使用 REST API 完成的,而不是使用 Web 应用程序客户端。
所以我的第一个问题是......这是一个错误还是一个功能?
我对答案的猜测是这是一个“功能”——这就是 Oauth 的工作方式——你不希望 Web 应用程序客户端知道与资源服务器一起存储的用户 ID/电子邮件地址(在我的情况下是提交者,Twitter 在上面的幻灯片)。
如果这是正确的,那么如果我希望 Web 应用程序客户端知道用户是谁,那么 Web 应用程序客户端应该提供用户身份验证。由于我在服务器端使用 Google 的 UserService,因此我还在 Web 应用程序客户端上实现了基于 UserService 的身份验证。现在,如果用户还进行了 Web 应用程序客户端身份验证,那么 Web 应用程序客户端具有用户的身份。所以这一切都很好。
将这两者结合起来也有效——但我不太明白为什么。
- 在网络应用程序上,我通过 Google 的 userService 登录(技术上使用 GaeAuthenticator,它只使用 Google 帐户)。现在网络应用程序知道我是谁并且可以显示我的电子邮件地址。
- 通过网络应用程序,我向服务器询问我的承诺。服务器通过给我登录页面来响应,我可以在其中选择我的 OpenId 提供程序。
2a. 如果我选择 Google,UserService 似乎知道我已经通过网络应用程序登录并显示我的承诺。
2b。如果我选择雅虎(或其他),我必须通过雅虎进行身份验证,然后我会看到该雅虎用户的承诺。这一切对我来说似乎都很好——除了 UserService 是如何知道我已经登录的?网络客户端位于 x.appspot.com,服务器位于 y.appspot.com。答案是否像 UserService 集成在所有 apppot.com 中一样简单?
无论如何,感谢任何可以回答这两个问题的人 - 或者只是确认我在正确的道路上。
(注意:我使用 Google 的 UserService 创建登录 url,我的 web 应用程序客户端和资源服务器在 apppot 上,使用联合身份验证,这一切都是 Java)。