3

我正在尝试使用socialauth登录 google、facebook 等(我将在此处假设 google),并对它的工作原理有疑问。我正在使用没有 Seam 的 JSF 2。基本思想是你:

  • 进行一些 API 调用,表明您想使用 google 登录。

  • 进行另一个 API 调用,该调用返回 google 的 URL。

  • 提供一个结果 URL,google 将使用该 URL 重定向回您的站点。

  • 重定向到谷歌网址。

  • 然后谷歌将立即重定向回您的网站或首先询问登录详细信息。

我的困惑是将出站和入站的数据链接在一起。在入门页面(上面链接)中,他们建议这样做:

出境

SocialAuthManager manager = new SocialAuthManager();
String successUrl = "http://my.domain.com/socialauthd/successAction.xhtml";
String url = manager.getAuthenticationUrl(id, successUrl);
// Store in session
session.setAttribute("authManager", manager);

入站

// get the auth provider manager from session
SocialAuthManager manager = (SocialAuthManager)session.getAttribute("authManager");

我遇到的问题是我看不到它是如何工作的,而且它在测试中也没有。他们建议在会话中存储对 SocialAuthManager 实例的引用,但是当从 google 收到请求时,会创建一个新会话。它没有 JSESSIONID cookie,因此不是首先向 google 发送请求的会话的一部分。

为了解决这个问题,我从 socialauth api (openid.assoc_handle - 它作为查询参数发送) 获得了一个唯一的每个请求 id,将它放在应用程序范围 bean 中的 concurrentHashMap 中,并在 preRenderView 侦听器中检索引用完成页面(successUrl - 在示例中命名错误,因为它被称为任何一种方式)。

对于文档中未包含的内容,这一切似乎很麻烦。尽管我通常使用 CODI @ViewAccessScoped,但我已经尝试使用 @RequestScoped CDI bean。使用 CODI,我尝试将 windowId 添加到成功 URL,并将 JSESSIONID cookie 添加到重定向,但两种方法都不起作用。我不认为 bean 范围是相关的,但信息越多越好。

我可以深入研究 spring、seam 和 struts 示例,但对于纯粹的 EE 6 开发人员来说,这是很多开销,并且通过更好地理解这个问题,我可以生成一个简单的、工作的、仅 JSF 的示例,我将提供给用于 google 代码的 socialauth 团队。

我是否遗漏了一些明显的东西,或者这只是很复杂?如果是这样,他们为什么要记录一种根本行不通的方法?

编辑:我认为successUrl 的命名可能比我想象的更合适,因为在使用Yahoo 进行测试时,我意识到除非提供正确的登录详细信息,否则您不会被重定向回自己的站点。我希望这对所有提供商都是一样的。我已向 socialauth 网站添加了一些关于此解决方案的评论,以及我记录的有关此问题的问题(两者都没有收到任何参与 socialauth 项目的人的任何回复)。

4

1 回答 1

3

在回调 URL 中包含jsessionid路径参数。

String successUrl = "http://my.domain.com/socialauthd/successAction.xhtml"
    + ";jsessionid=" + session.getId();

请注意,这不是特定于 JSF API,而是特定于Servlet API(第 7.1.3 章,URL 重写)。

于 2012-09-07T02:16:36.773 回答