【问题标题】:Open id authentication in the same page在同一页面中打开身份验证
【发布时间】:2010-12-23 05:22:06
【问题描述】:

我有一个要求,登录页面在弹出窗口中打开主页,

这是我在正常身份验证中的处理方式:

<http>
...
<form-login login-page="/Login.html" authentication-failure-url="/LoginHandler.jsp" always-use-default-target="false" default-target-url="/LoginHandler.jsp"/>
...
</http>

登录页面创建一个 ajax 调用(内部使用 GWT 的请求生成器)并读取响应 html 页面。因此,如果 LoginHandler.jsp 包含“success”,则登录成功, 或者如果 LoginHandler.jsp 包含“失败”,则登录失败。

无论哪种情况,Login.html 都知道身份验证失败或成功,并在成功时打开一个包含主屏幕的弹出窗口。

现在,我需要让我的系统支持 OpenID,如果我理解得很好,open id 身份验证的工作方式如下,如果成功,它将打开成功 url(在我的情况下主要是 LoginHandler.jsp),但是, 如果失败.... 它会打开目标服务器的登录屏幕(例如 google 的登录屏幕),我该如何设计我的代码以在这个场景中工作??

这是我的配置:

<openid-login authentication-failure-url="/LoginHandler.jsp" default-target-url="/LoginHandler.jsp" user-service-ref="openIdUserService"/>

这是我使用 RequestBuilder 登录的方式:

// Encode values for sending as a post request.
String postData = "j_username=" + username 
        + "&j_password=" + password
        + ((isRemembered) ? "&_spring_security_remember_me=on" : "");
String serverUrl = URL.encode("j_spring_security_check");

/*
 * Authenticate the user using a request builder to send the request to the server.
 * <p>on successful authentication, open main screen in a pop up
 * */
try
{
    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, URL.encode(serverUrl));
    requestBuilder.setHeader("Content-Type", "application/x-www-form-urlencoded");
    requestBuilder.sendRequest(postData, new RequestCallback()
    {
    public void onError(Request request, Throwable exception)
    {
        //Do nothing
    }

    public void onResponseReceived(Request request, Response response)
    {
        String responseText = response.getText();
        int indexStart = responseText.indexOf(startMessageIndicator) + startMessageIndicator.length();
        int indexEnd = responseText.indexOf(endMessageIndicator);
        String text = responseText.substring(indexStart, indexEnd);

        //Login was a success
        if (text.contains(successMessageIndicator))
        {
        //Woophie !! code for success comes here.
        }
        else if (text.contains(errorMessageIndicator))
        {
        //Ooops ! get the error message encoded in the page
        }
    }
    });
}
catch (RequestException e)
{
    //Do nothing
}

有没有办法使用相同的方法进行基于开放 id 的身份验证?

【问题讨论】:

  • 我不完全理解你的问题。但如果这对您有所启发,请考虑一下这个 OpenID 登录体验的弹出流程:openidux.dotnetopenauth.net
  • 如前所述,我能够进行基于开放 ID 的登录,但我不知道如何以 ajax 样式进行操作
  • 我检查了那个链接,我很想知道你是如何实现在新窗口中打开referer的,话虽如此,我认为你正在刷新你的页面......
  • 您是如何获得用户的电子邮件 ID 的?

标签: authentication gwt openid popup spring-security


【解决方案1】:

OpenID 不像你描述的那样工作。用户在您的网站上输入他们的 OpenID 标识符,并且将始终被重定向到 OpenID 提供者 (OP) 的网站进行验证。验证后,用户将被重定向回您的网站。他们不能同时输入他们的 OpenID 标识符和 OP 在您的站点上期望的密码,就像他们可以使用传统的用户名/密码表单身份验证一样。希望对您有所帮助!

【讨论】:

  • 我成功实现了对用户进行身份验证的开放 id,但我不知道如何以基于 Ajax 的样式进行操作。
  • 听彼得的。必须有从提供商到您网站的重定向。
  • 可能有重定向,但这完全由 spring 管理。我不确定我在这里如何适应我的方法......
  • 当 OpenID 对用户进行身份验证时,您将始终被重定向到 OP 站点,以便用户使用密码进行身份验证。一旦他们通过了身份验证,并且 OP 返回签名的身份验证断言,那么您的应用程序就可以做它想做的任何事情(设置 cookie 等),但此时您已经超出了 OpenID 的范围,并且进入了“记住我”之类的东西" 身份验证。
【解决方案2】:

我不确定上述答案是否准确,因为我使用 OpenID 登录 SO,它永远不会将我重定向到任何地方。我猜这是因为它将我的 OpenID 密码保存在 cookie 中,并且只有在它不起作用时才会重定向我。不过,我真的不知道这一切是如何运作的。

【讨论】:

  • hmm,我不认为它使用cookie...我能够使用请求生成器方法成功进行身份验证,但是,当用户未登录时,响应是谷歌的登录页面。我还没有破解如何从这个响应对象中获取 url....
  • 有可能您使用的任何 OpenID 提供程序本身都会设置一个 cookie,并且如果您已经使用它们登录,则不会提示您登录。如果这是真的,那似乎很危险! SO 也有可能保留自己的会话 cookie,并且仅在该 cookie 过期时委托给 OpenID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2015-06-26
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多