socialauth - 你可以在重定向中使用相同的会话吗?

时间:2012-09-06 20:14:39

标签: jsf single-sign-on socialauth

我正在尝试使用socialauth登录google,facebook等人(我将在这里假设google)并对其工作原理提出疑问。我正在使用没有Seam的JSF 2。基本的想法是你:

  • 发出一些API调用,表明您要使用google登录。

  • 进行另一次API调用,返回google的网址。

  • 提供结果网址,谷歌将使用该网址重定向回您的网站。

  • 重定向到Google网址。

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

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

外向

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实例的引用,但是当从谷歌收到请求时,会创建一个新会话。它没有JSESSIONID cookie,因此不是首先将请求发送到谷歌的会话的一部分。

要解决这个问题,我从socialauth api获得了一个唯一的per-request id(openid.assoc_handle - 它作为查询参数发送),将它放在app scoped bean的concurrentHashMap中,并在preRenderView中检索引用完成页面中的监听器(successUrl - 在示例中严重命名,因为它以任何方式调用)。

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

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

我是否遗漏了一些明显的东西,或者这是否必须复杂化?如果是这样,他们为什么要记录一种根本不起作用的方法呢?

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

1 个答案:

答案 0 :(得分:3)

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

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

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