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 を送信していないclientId
かclientSecret
、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_id
とclient_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 に戻ると、エラーが発生します。
とにかく、この問題の原因は何ですか?また、どのように修正されるのでしょうか?