2

我在 Google AppEngine Java 中实现联合登录时遇到问题。 https://developers.google.com/appengine/articles/openid

我正在获得用户服务并获得当前用户。如果当前用户为空,那么我将要求用户服务使用我选择的开放 id 提供程序创建一个登录 url(最终,用户将被允许选择)。这是代码片段

UserService userService = UserServiceFactory.getUserService();

User user = userService.getCurrentUser();

if(user == null)
{
    userService.createLoginURL(request.getRequestURI(),null,"yahoo.com",null);
    //do a redirect
}

该方法的第三个参数UserService.createLoginURL(....)是 federatedIdentity(参见此处)。对于这个论点,到目前为止,我一直使用这些值"yahoo.com", "http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds", "https://openid.stackexchange.com/",并且一直被重定向到 Google 帐户的登录页面。我还注意到,使用这些参数返回的 url 与没有参数生成的 url 略有不同。

我想我在这里犯了一些错误,但无法弄清楚在哪里。究竟应该将什么传递给该参数,以便将用户重定向到相应提供商的登录页面?例如,yahoo、stackoverflow、facebook 等。

作为一个扩展问题,我相信一旦用户通过身份验证并寻求批准,App Engine 将在下次询问时通过 UserService.getCurrentUser() 自动返回该用户。我对么?

作为记录,我已在应用程序设置中将“身份验证类型”设置为“联合登录”。

2012 年 12 月 5 日更新:我选择了 openid4java。它在发行版中提供了直接示例作为示例,其工作方式类似于应用引擎的魅力。

4

1 回答 1

2

这可能不是您想听到的,但我们已经在那里并放弃了 OAuth 2 的 OpenID。我知道 OpenID 用于身份验证,OAuth 用于授权(请参阅this other question),但在现实生活中人们只是在使用两者的 OAuth。

我们和 Scribe 一起去了,对此非常满意。请注意,这意味着推出您自己的身份验证解决方案,并且可能会限制您的提供者列表,因为每个提供者的处理方式都不同。

于 2012-12-08T20:43:04.637 回答