■アプリケーション構成
①Salesforce
↓ ※リンクで呼び出し
②Webアプリ(SpringBoot)
■背景
※Salesforce=①、Webアプリ=②
ユーザーはまず①にログインした後、画面内リンクを押下することで②を呼び出します。
②の認証はOAuth2となっており、処理の中でSalesforceAPIを呼び出しています。
※①アクセス時に認証済みとなっているため、基本的に②アクセス時は認証済みとされログイン画面には遷移しない(SSO)
元々、①の入り口は1つ(一般ユーザーが利用する一般的なSalesforceの画面 : ①-aとする)だったため、
②は下記に記載した実装内容で問題なく動作(認証⇨API実行)していたのですが、
①の入り口がもう一つ(ログイン画面も上記とは異なるExperience Cloudサイト:①-bとする)増えました。
その結果、①-aから②にアクセスした時は認証済みとして②の画面が表示されるが、①-bから②にアクセスした場合、未認証としてログイン画面に遷移するようになりました。
(ただし、②に設定しているOAuth認証情報等は①-a用のため、遷移先のログイン画面は①-aのものが表示される)
■実現したいこと
②での認証において、①-a、①-bどちらからアクセスされたか判別し、OAuth認証エンドポイント等
を切り替えたい(=どちらから来てもSSOしたい)
※どちらからのアクセスかは②呼び出し時のパラメータで判別可能
■Webアプリ内の認証処理
・OAuth2 Autoconfigを利用
■現状の実装
[pom.xml]
pom.xml
1<dependency> 2 <groupId>org.springframework.security.oauth.boot</groupId> 3 <artifactId>spring-security-oauth2-autoconfigure</artifactId> 4 <version>2.1.4.RELEASE</version> 5</dependency>
[設定ファイル]
applition.properties
1security.oauth2.client.client-authentication-scheme = form 2security.oauth2.client.authentication-scheme = header 3security.oauth2.client.grant-type = autorization_code 4security.oauth2.client.access-token-uri = https://login.salesforce.com/services/oauth2/token 5security.oauth2.client.user-authorization-uri = https://login.salesforce.com/services/oauth2/authorize 6security.oauth2.resource.user-info-uri = https://login.salesforce.com/services/oauth2/userinfo
[②のエントリポイントでのBean定義]
Java
1@Bean 2public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, 3 OAuth2ProtectedResourceDetails details) { 4 return new OAuth2RestTemplate(details, oauth2ClientContext); 5}
■現状調査してわかっていること
・サーバー起動時に上記Bean処理(oauth2RestTemplateのインスタンス作成)が実施されており、
①からのアクセス時には実行されていない。
・上記oauth2RestTemplateインスタンスには、OAuth2認証に必要な情報がセットされている
・上記エントリポイントに記載したBean定義を消すとサーバーは起動しない(oauth2-autoconfig導入時は必須と認識)
・application.propertiesのOAuth認証情報を、①-b用の情報に書き換えた上で、①-bからアクセスした場合はSSOに成功するが、①-aからアクセスした場合はログイン画面(①-b用)が表示される。
■質問
・今回やりたいことはアクセス元から渡されるパラメータを元にOAuth認証に必要な各種エンドポイントを切り替え、アクセス元が単独だった時と同様、認証通過(SSO)し、API呼び出しされることですが、
今回の構成で実現は可能でしょうか?
※OAuth2RestTemplateはサーバー起動時に生成されているため、外部からのアクセス時に切り替えることができないのでは??
・今回の方法を実現できるとしたら、"filterChain"を作成、Bean登録し適切な処理を記載することだと
考えていますがいかがでしょうか。
このように実装すればいけるというのがあればご教示いただきたいです。
あなたの回答
tips
プレビュー