我正在尝试使用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项目的任何人的任何回复)。
答案 0 :(得分:3)
在回调网址中包含jsessionid
路径参数。
String successUrl = "http://my.domain.com/socialauthd/successAction.xhtml"
+ ";jsessionid=" + session.getId();
请注意,这不是特定于JSF API,而是Servlet API(第7.1.3节,URL重写)。