【发布时间】:2015-07-27 15:49:55
【问题描述】:
Google 在 4 月底停止支持 OpenID,我们需要将应用的身份验证系统迁移到 OAuth2。阅读Google’s guide,可以直接发出 OAuth 请求并检索我们的应用程序所需的 Google 用户信息。
但是,我们的应用程序大量使用 Spring security 3.0.5,因此我们必须将 OAuth 与 Spring security 集成。在标准的 Web 应用场景中,一旦用户成功登录,Spring 会自动创建一个 Spring 安全上下文对象。许多 JSP 页面使用 Spring 安全标签来检查用户是否已登录,或者用户是否为管理员用户,并确定要显示的适当页面内容。 Spring security oauth 似乎是完成这项工作的理想框架。
在开发工作期间,我遇到了以下问题:
在用户批准访问 Google oauth 页面上的基本信息后,Google 会将用户重定向回我们的应用程序页面(在 Google 应用程序控制台中预先配置)。我找不到检索用户信息的“Spring”方式(尽管我可以使用 Google API 检索用户信息)。
当 Google 将用户重定向回我们的应用程序时,Spring security 需要知道用户已成功通过身份验证,以便它可以创建一个 SecurityContext 对象。但到目前为止,我还没有找到让 Spring 安全知道这一点的方法。
我可以成功运行 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。
这里是读取谷歌用户配置文件的代码:
@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);
}
}
【问题讨论】:
-
你需要 Spring Social。检查this,它对 Facebook 和 Twitter 进行了解释,但对于 Google 应该类似(使用 Spring Social Google)。
标签: spring spring-security oauth-2.0 spring-security-oauth2