3

OAuth サポートを既存の Spring webapp に追加して、人々が Google/Facebook/Twitter/etc でログインできるようにしようとしています。アカウント。これを行うために、「spring-social」フレームワークと「spring-social-google」ライブラリを使用しています。私はまた、いくつかの制約の中で作業しながらこれをやろうとしています:

  • 既存の webapp は、認証やリソースへのアクセス制御に spring-security を使用せず、独自のフォームベースの認証を提供します。
  • 既存の webapp は、サーブレット コンテナーの を使用して認証済みユーザーの詳細を追跡しません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)

とにかく、上記の制限によりさまざまな問題が発生しましたが、そのほとんどは回避策を見つけることができました。ただし、Google OAuth コネクタから奇妙な動作が発生しています (Twitter と Facebook は正しく動作しているようです)。基本的に、OAuth を送信していないclientIdclientSecret、Google への最終リクエスト中に送信していないようです。

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にアクセスして、同じデータを同じ URL (https://accounts.google.com/o/oauth2/token) に POST し、手動で と の値を追加する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 に戻ると、エラーが発生します。

とにかく、この問題の原因は何ですか?また、どのように修正されるのでしょうか?

4

1 に答える 1

1

Google 開発者コンソールで Google+ API をオンにしていない可能性があります。

これは、OAuth 2 トークンまたは API キーの取得とは別のタスクです。

まだ行っていない場合

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

  2. プロジェクトに移動します。

  3. 「API」をクリックします。

  4. 「Google+ API」が有効な API のリストにあることを確認します。そうでない場合は、参照して有効にします。

于 2015-01-19T00:49:43.473 に答える