spring-social-google不发送客户端ID /客户端密钥

时间:2012-11-07 05:47:28

标签: java spring oauth

我正在尝试向现有的Spring网络应用添加OAuth支持,以允许用户使用他们的Google / Facebook / Twitter /等登录。账户。要做到这一点,我正在使用'spring-social'框架,以及'spring-social-google'库。我也在尝试在一些限制条件下工作时这样做:

  • 现有的webapp不使用spring-security进行身份验证或控制对资源的访问,它提供了自己的基于表单的身份验证。
  • 现有的webapp不使用servlet-container的Principal跟踪经过身份验证的用户详细信息,而是在HTTP会话中存储对经过身份验证的用户的引用。
  • 现有的webapp没有(也不能)将Spring DispatcherServlet绑定到webapp根URL(即/)。

数据库中的帐户是通过电子邮件唯一键入的,所以我真正试图做的就是将流程大致粘合在一起:

Login Page (user chooses between OAuth and direct login)
    -> <Provider OAuth Flow>  (user completes OAuth authorization)
        -> OAuth Callback URL (grab user email, check for existing account, create if needed) 
            -> Post-login Landing Page (done)

无论如何,上面提到的限制导致了各种各样的问题,其中大部分都是我设法找到的解决方法。但是我从谷歌OAuth连接器(Twitter和Facebook似乎正常工作)得到了一些奇怪的行为。基本上,它似乎没有在最终请求期间向Google发送OAuth clientIdclientSecret

DEBUG: org.springframework.web.client.RestTemplate - Writing [
    {code=[4/dVVrFDpNLDGTmXCuuQj6fcfaetEU.UkLPQd7NOLYbgrKXntQAax0INYiydQI], 
     redirect_uri=[http://localhost:8080/oauth/signin/google], 
     grant_type=[authorization_code]}] as "application/x-www-form-urlencoded"

这将返回代码400(“错误请求”)。

如果我转到hurl.it并将相同的数据发布到同一网址(https://accounts.google.com/o/oauth2/token)并手动添加client_idclient_secret值,该调用返回成功的响应。

那么可能导致Google连接器忽略这些值的原因是什么?

作为参考,我在项目中包含了spring-social-google库,如:

    <dependency>
        <groupId>org.springframework.social</groupId>
        <artifactId>spring-social-google</artifactId>
        <version>1.0.0.M1</version>
    </dependency>

...然后在我的@Configuration课程中我得到了:

@Bean
@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) 
public ConnectionFactoryLocator connectionFactoryLocator() {
    ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();

    registry.addConnectionFactory(
            new GoogleConnectionFactory(
                    "<google client id>",  
                    "<google secret key>"));

    registry.addConnectionFactory(
            new FacebookConnectionFactory(
                    "<facebook client id>", 
                    "<facebook secret key>"));

    registry.addConnectionFactory(
            new TwitterConnectionFactory(
                    "<twitter client id>",   
                    "<twitter secret key>"));

    return registry;
}

我正在使用的其余内容几乎是spring-social-showcase示例中的标准(尽管已被删除以删除无关的内容并在上述限制内工作)。奇怪的是,尝试使用Google登录可以正确显示Google上的OAuth授权页面,并正确显示我的应用/项目名称。我点击“允许”按钮授权OAuth登录并返回到webapp后发生错误。

无论如何,可能导致此问题的原因,以及如何解决?

1 个答案:

答案 0 :(得分:1)

您可能没有在google开发者控制台中启用google + api。

这是获取OAuth 2令牌或api密钥的单独任务。

如果你还没有这样做

  1. http://console.developers.google.com

  2. 导航到您的项目。

  3. 点击“API&#39;”。

  4. 检查Google+ API&#39;在Enabled API的列表中。如果不是,请浏览并启用它。