差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| study:java:sharepointonline:implement4 [2021/07/20 07:48] – [Mainコード] banana | study:java:sharepointonline:implement4 [2025/08/23 13:01] (現在) – [認証クーキー取得の実装] banana | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== 認証クーキー取得の実装 ====== | + | ====== 認証クッキー取得の実装 ====== |
| 本稿では、[[study: | 本稿では、[[study: | ||
| - | ===== Mainコード ===== | + | {{keywords> |
| + | |||
| + | ====== Mainコード | ||
| 実装Mainコードを以下に示します。 | 実装Mainコードを以下に示します。 | ||
| <code java> | <code java> | ||
| 行 38: | 行 40: | ||
| ★ポイント2\\ | ★ポイント2\\ | ||
| Binary tokenをPOST送信するため、Bodyに追加します。 | Binary tokenをPOST送信するため、Bodyに追加します。 | ||
| + | |||
| + | ====== RestTemplateWithCookies ====== | ||
| + | RestTemplate拡張クラスを以下に示します。 | ||
| + | <code java> | ||
| + | public class RestTemplateWithCookies extends RestTemplate { | ||
| + | private static final Logger logger = LoggerFactory.getLogger(RestTemplateWithCookies.class); | ||
| + | private final List< | ||
| + | private final String COOKIE_RT_FA = " | ||
| + | private final String COOKIE_FED_AUTH = " | ||
| + | |||
| + | // ***** constructor ***** | ||
| + | public RestTemplateWithCookies() { } | ||
| + | |||
| + | // ***** public method ***** | ||
| + | |||
| + | public synchronized List< | ||
| + | return cookies; | ||
| + | } | ||
| + | |||
| + | public synchronized void resetCookies() { | ||
| + | cookies.clear(); | ||
| + | } | ||
| + | |||
| + | public boolean isAuthenticated() { ★ポイント1 | ||
| + | int _count = 0; | ||
| + | for (HttpCookie _cookie : getCookies()) { | ||
| + | if ((COOKIE_RT_FA.equals(_cookie.getName()) || | ||
| + | COOKIE_FED_AUTH.equals(_cookie.getName())) && !"" | ||
| + | _count++; | ||
| + | } | ||
| + | return (_count == 2); | ||
| + | } | ||
| + | |||
| + | // ***** protected method ***** | ||
| + | |||
| + | /* (non-Javadoc) | ||
| + | * @see org.springframework.web.client.RestTemplate# | ||
| + | * org.springframework.web.client.RequestCallback, | ||
| + | */ | ||
| + | @Override | ||
| + | protected <T> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, | ||
| + | final ResponseExtractor< | ||
| + | logger.info(" | ||
| + | final List< | ||
| + | |||
| + | return super.doExecute(url, | ||
| + | @Override | ||
| + | public void doWithRequest(ClientHttpRequest chr) throws IOException { | ||
| + | if (_cookies != null && _cookies.size() > 0) { ★ポイント2 | ||
| + | StringBuilder _sb = new StringBuilder(); | ||
| + | for (HttpCookie _cookie : _cookies) { | ||
| + | _sb.append(_cookie.getName()).append(" | ||
| + | }//for | ||
| + | logger.debug(" | ||
| + | chr.getHeaders().add(HttpHeaders.COOKIE, | ||
| + | }//if | ||
| + | requestCallback.doWithRequest(chr); | ||
| + | } | ||
| + | }, new ResponseExtractor< | ||
| + | @Override | ||
| + | public T extractData(ClientHttpResponse chr) throws IOException { | ||
| + | processHeaders(chr.getHeaders()); | ||
| + | return responseExtractor.extractData(chr); | ||
| + | } | ||
| + | }); | ||
| + | }// | ||
| + | |||
| + | // ***** private method ***** | ||
| + | |||
| + | private void processHeaders(HttpHeaders headers) { ★ポイント3 | ||
| + | final List< | ||
| + | if (_rawCookies != null && !_rawCookies.isEmpty()) { | ||
| + | for (String _rawCookie : _rawCookies) { | ||
| + | List< | ||
| + | for (HttpCookie _parsedCookie : _parsedCookies) { | ||
| + | HttpCookie _cookieExists = filterCookieByName(_parsedCookie.getName()); | ||
| + | //if same named cookie is already exists, remove that cookie. | ||
| + | if (_cookieExists != null) { | ||
| + | cookies.remove(_cookieExists); | ||
| + | } | ||
| + | logger.debug(" | ||
| + | cookies.add(_parsedCookie); | ||
| + | }//for | ||
| + | }//for | ||
| + | }//if | ||
| + | }// | ||
| + | |||
| + | private HttpCookie filterCookieByName(String name) { | ||
| + | HttpCookie _result = null; | ||
| + | for (HttpCookie _cookie : cookies) { | ||
| + | if (_cookie.getName().equals(name)) { | ||
| + | _result = _cookie; | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | return _result; | ||
| + | }// | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | ★ポイント1\\ | ||
| + | cookiesリストにrtFaクッキー((このクッキーは、**「認証済みフォーム」を表す「Ready to Form authentication」の略です。Microsoft 365の認証基盤であるAzure Active Directory (Azure AD)**でユーザーが認証された際に発行されます。これは、ユーザーがシングルサインオン (SSO) セッションを確立したことを示します。))とFedAuthクッキー((このクッキーは、**「フェデレーション認証」**を表す「Federated Authentication」の略です。rtFaクッキーを使ってSharePoint Onlineにアクセスする際に、SharePoint Onlineが独自に発行するセッションクッキーです。このクッキーによって、ユーザーはSharePoint Onlineのサイトやファイルへのアクセス権を維持できます。))が存在するか確認するメソッドです。\\ | ||
| + | 既に認証済みの場合、処理を軽減させるために使われます。 | ||
| + | |||
| + | ★ポイント2\\ | ||
| + | リクエストヘッダーCookieにrtFaクッキーとFedAuthクッキーを追加します。 | ||
| + | |||
| + | ★ポイント3\\ | ||
| + | レスポンスヘッダーSet-CookieからrtFaクッキーとFedAuthクッキーを取り出して、cookiesリストに追加するメソッドです。 | ||
| + | |||
| + | |||
| + | |||
| + | ====== Reference ====== | ||
| + | * [[https:// | ||
| + | |||
| + | ~~DISCUSSION~~ | ||
| + | |||