【发布时间】:2012-09-06 20:14:38
【问题描述】:
我正在尝试使用socialauth 登录 google、facebook 等(我将在此处假设 google)并对其工作原理有疑问。我正在使用没有 Seam 的 JSF 2。基本思想是您:
进行几次 API 调用,表明您想使用 google 登录。
进行另一个 API 调用,返回 google 的 URL。
提供一个结果 URL,google 将使用该 URL 重定向回您的网站。
重定向到谷歌网址。
然后 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 实例的引用,但是当从 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 的示例,我将制作它可供 socialauth 团队用于 google 代码。
我是否遗漏了一些明显的东西,或者这只是很复杂?如果是这样,他们为什么要记录一种根本行不通的方法?
编辑:我认为successUrl的命名可能比我想象的更合适,因为在使用雅虎进行测试时,我意识到除非正确的登录详细信息,否则您不会被重定向回自己的站点假如。我希望这对所有提供商都是一样的。我已在 socialauth 网站以及我记录的有关此问题的问题中添加了一些有关此解决方案的 cmets(均未收到任何参与 socialauth 项目的人的任何回复)。
【问题讨论】:
标签: jsf single-sign-on socialauth