如何通知Spring 3.0.5用户已通过OAuth2

时间:2015-05-15 16:19:07

标签: spring spring-security oauth-2.0 spring-security-oauth2

Google于4月底停止支持OpenID,我们需要将应用程序的身份验证系统迁移到OAuth2。阅读Google’s guide,可以直接发出OAuth请求并检索我们的应用程序所需的Google用户信息。

但是,我们的应用程序大量使用Spring security 3.0.5,因此我们必须将OAuth与Spring安全性集成。在标准Web应用程序场景中,一旦用户成功登录,Spring就会自动创建Spring安全上下文对象。许多JSP页面使用Spring安全标记来检查用户是否已登录,或者用户是否为admin用户,并确定要显示的适当页面内容。似乎Spring security oauth是完成这项工作的理想框架。

在开发工作期间,以下是我遇到的问题:

  1. 在用户批准访问Google oauth页面上的基本信息后,Google会将用户重定向回我们的应用程序页面(在Google应用程序控制台中预先配置)。我无法找到“Spring”方式来检索用户信息(尽管我可以使用Google API检索用户信息)。

  2. 当Google将用户重定向回我们的应用程序时,Spring安全性需要知道用户已成功通过身份验证,以便它可以创建SecurityContext对象。但到目前为止,我找不到让Spring安全知道这一点的方法。

  3. 我可以成功运行Spring Oauth2演示应用程序tonr2(github.com/spring-projects/spring-security-oauth/tree/1.0.0.RELEASE/samples/oauth2/tonr)。该演示要求用户使用本地用户名/密码登录,然后在点击“访问Facebook好友”后,用户被重定向到Facebook站点,使用oauth身份验证登录到facebook并最终检索他们的好友列表。但是,我们希望避免上述两个身份验证步骤。以下是一个按照我们的方式工作的网站示例(减去本地登录框) - 请参阅http://lucy.me/login/auth

    以下是阅读Google用户个人资料的代码:

    @RequestMapping(value = "google", method = RequestMethod.GET)
    public String google(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
      log.debug("Google OAuth filter trigger!");
      String c = request.getParameter("code");
    
      if(c==null || "".equals(c)) {
         // trigger google oauth2
      }else{
         ResponseEntity<Object> forEntity = googleRestTemplate.getForEntity("https://www.googleapis.com/oauth2/v1/userinfo", Object.class);
      }
    }
    

1 个答案:

答案 0 :(得分:1)

简短回答:你不能!

没有用户信息通过网络传输 - 用户名或密码。因此,您无法在OAuth客户端应用程序的Spring上下文中找到它。

当重定向从Google发送到您的应用时,如果用户身份验证成功,则重定向将返回stateKey和授权代码,该代码将允许Spring Security请求访问令牌。获得访问令牌后,您可以代表该用户向服务器发出请求,无需了解任何有关他的信息。这就是OAuth之美。

前面提到的状态键会将重定向绑定到应用程序中的上下文。

您的责任是在Spring OAuth客户端应用程序中拥有一个用户上下文,该用户上下文将绑定到您将从服务器(Google)获取的访问令牌/刷新令牌。

当然,如果用户授予您许可权,您可以查询Google并获取用户名,但除此之外,OAauth协议将不允许您收集有关该用户的任何信息。

以下是使用授权许可的基本流程:https://tools.ietf.org/html/rfc6749#section-4.1