差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
study:java:sharepointonline:implement4 [2021/07/20 08:11] – [Mainコード] bananastudy:java:sharepointonline:implement4 [2025/08/23 13:01] (現在) – [認証クーキー取得の実装] banana
行 1: 行 1:
-====== 認証クキー取得の実装 ======+====== 認証クキー取得の実装 ======
 本稿では、[[study:java:sharepointonline:poc|POC of consuming Sharepoint online]]のPOC段階4の実装を紹介します。\\ 本稿では、[[study:java:sharepointonline:poc|POC of consuming Sharepoint online]]のPOC段階4の実装を紹介します。\\
  
-===== Mainコード =====+{{keywords>Get authenticated cookie rtFa FedAuth Sharepoint online}} 
 + 
 +====== Mainコード ======
 実装Mainコードを以下に示します。 実装Mainコードを以下に示します。
 <code java> <code java>
行 39: 行 41:
 Binary tokenをPOST送信するため、Bodyに追加します。 Binary tokenをPOST送信するため、Bodyに追加します。
  
-===== RestTemplateWithCookies =====+====== RestTemplateWithCookies =====
 +RestTemplate拡張クラスを以下に示します。 
 +<code java> 
 +public class RestTemplateWithCookies extends RestTemplate { 
 +  private static final Logger logger = LoggerFactory.getLogger(RestTemplateWithCookies.class); 
 +  private final List<HttpCookie> cookies = new ArrayList<>(); 
 +  private final String COOKIE_RT_FA = "rtFa"; 
 +  private final String COOKIE_FED_AUTH = "FedAuth"; 
 + 
 +  // ***** constructor ***** 
 +  public RestTemplateWithCookies() { } 
 + 
 +  // ***** public method ***** 
 + 
 +  public synchronized List<HttpCookie> getCookies() { 
 +    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())) && !"".equals(_cookie.getValue())) 
 + _count++; 
 +    } 
 +    return (_count == 2); 
 +  } 
 + 
 +  // ***** protected method ***** 
 + 
 +  /* (non-Javadoc) 
 +   * @see org.springframework.web.client.RestTemplate#doExecute(java.net.URI, org.springframework.http.HttpMethod, 
 +   * org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor) 
 +   */ 
 +  @Override 
 +  protected <T> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, 
 + final ResponseExtractor<T> responseExtractor) throws RestClientException { 
 +    logger.info("RestTemplateWithCookies.doExecute() Called."); 
 +    final List<HttpCookie> _cookies = getCookies(); 
 + 
 +    return super.doExecute(url, method, new RequestCallback() { 
 + @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("=").append(_cookie.getValue()).append(";"); 
 +     }//for 
 +     logger.debug("cookie is added to request: {}", _sb.toString()); 
 +     chr.getHeaders().add(HttpHeaders.COOKIE, _sb.toString()); 
 +   }//if 
 +   requestCallback.doWithRequest(chr); 
 +
 +      }, new ResponseExtractor<T>() { 
 + @Override 
 + public T extractData(ClientHttpResponse chr) throws IOException { 
 +   processHeaders(chr.getHeaders()); 
 +   return responseExtractor.extractData(chr); 
 +
 +      }); 
 +  }//doExecute 
 + 
 +  // ***** private method ***** 
 + 
 +  private void processHeaders(HttpHeaders headers) {  ★ポイント3 
 +    final List<String> _rawCookies = headers.get(HttpHeaders.SET_COOKIE); 
 +    if (_rawCookies != null && !_rawCookies.isEmpty()) { 
 + for (String _rawCookie : _rawCookies) { 
 +   List<HttpCookie> _parsedCookies = HttpCookie.parse(_rawCookie); 
 +   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("accepted cookie: {}", _parsedCookie); 
 +     cookies.add(_parsedCookie); 
 +   }//for 
 + }//for 
 +    }//if 
 +  }//processHeaders 
 + 
 +  private HttpCookie filterCookieByName(String name) { 
 +    HttpCookie _result = null; 
 +    for (HttpCookie _cookie : cookies) { 
 +      if (_cookie.getName().equals(name)) { 
 +        _result = _cookie; 
 +        break; 
 +      } 
 +    } 
 +    return _result; 
 +  }//filterCookieByName 
 + 
 +
 +</code> 
 + 
 +★ポイント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 =====+====== Reference ======
   * [[https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies|RestTemplate client with cookies]]   * [[https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies|RestTemplate client with cookies]]
  

QR Code
QR Code study:java:sharepointonline:implement4 (generated for current page)