0

刚刚实现了这个,我有一个关于身份验证和 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 应用程序客户端具有用户的身份。所以这一切都很好。

将这两者结合起来也有效——但我不太明白为什么。

  1. 在网络应用程序上,我通过 Google 的 userService 登录(技术上使用 GaeAuthenticator,它只使用 Google 帐户)。现在网络应用程序知道我是谁并且可以显示我的电子邮件地址。
  2. 通过网络应用程序,我向服务器询问我的承诺。服务器通过给我登录页面来响应,我可以在其中选择我的 OpenId 提供程序。

2a. 如果我选择 Google,UserService 似乎知道我已经通过网络应用程序登录并显示我的承诺。

2b。如果我选择雅虎(或其他),我必须通过雅虎进行身份验证,然后我会看到该雅虎用户的承诺。这一切对我来说似乎都很好——除了 UserService 是如何知道我已经登录的?网络客户端位于 x.appspot.com,服务器位于 y.appspot.com。答案是否像 UserService 集成在所有 apppot.com 中一样简单?

无论如何,感谢任何可以回答这两个问题的人 - 或者只是确认我在正确的道路上。

(注意:我使用 Google 的 UserService 创建登录 url,我的 web 应用程序客户端和资源服务器在 apppot 上,使用联合身份验证,这一切都是 Java)。

4

1 回答 1

0

好吧,问题第一部分的答案是“功能”——通过 OAuth 从 ResourceServer 获取资源不应该向 Web 应用程序客户端公开任何与用户相关的信息。

我将提出一个关于 UserService 如何发挥其魔力的更具体的问题。

于 2012-07-07T22:16:35.207 回答