====== POC of consuming Sharepoint online ====== 本稿では、Sharepoint onlineのRESTサービスを利用するための処理フローを紹介します。\\ Javaの実装例は別の記事で紹介する予定です。 {{keywords>POC of consuming Sharepoint online}} ===== on-premise環境のSharepoint連携との違いについて ===== 以前の投稿(([[study:java:sharepoint|Java consuming SharePoint REST API]]))でon-premise環境のSharepointサービスと連携する方法を紹介しました。\\ Sharepoint online連携においてon-premise環境と大きい違いは以下の2点です。\\ - 認証方式 - SSL接続(TLS) まず、認証方式ですがon-premiseと同じくユーザー認証((Add-in認証方式もありますが、認証に使うクライアントシークレットの有効期限がある為、ユーザー認証を選択しました。))を使いますが、認証スキムが異なります。\\ on-premise環境ではNTLM認証を使いましたが、cloud環境ではSAML認証を使います。また認証cookieも利用します。\\ SSL接続については、POC段階ではツール((curl, firefoxのRESTClient, POSTMAN等のツールがあります。))が対応しているため、意識する必要はありませんが、実装段階ではTLSのバージョン、Cipher Suite(暗号スイート)等を確認する必要が出てくるかも知れません。 ===== POCの概要 ===== POCの流れを下記に示します。 - %%UserRealm%%確認 - SAML Security Token取得 - Binary Token取得 - Sharepointサイトcookie取得 Sharepointサイトのcookieが取得できれば、RESTサービスの利用はon-premise環境の手順と同じです。\\ つまりForm Digest valueを取得して、%%Endpoint%%にHttpリクエストを送信することです。 ===== POC段階1 ===== %%UserRealm%%を確認する理由は、ADFS(Active Directory Federal Service)環境かどうかの確認と、ADFS環境の場合STS(Security Token Service)のURLを調べるためです。\\ 調べるために、下記URLをGET送信します。 https://login.microsoftonline.com/getuserrealm.srf?login=%(UserAccount)&xml=1 ここで、%%%(UserAccount)%%に利用アカウント(XXX.onmicrosoft.com若しくは独自ドメインのアカウント)を代入します。\\ ADFSを利用している場合のResponse例を下に示します。 3 2 %(UserAccount) Federated 独自ドメイン -1 https://xxxxxx.contoso.com/adfs/ls/?username=${UserAccount}&wa=wsignin1.0&wtrealm=urn%3afederation%3aMicrosoftOnline&wctx= true https://xxxxx.contoso.com/adfs/services/trust/2005/usernamemixed 0 XXXX false 証明書情報 https://xxxx.contoso.com/adfs/services/trust/mex 1 0 microsoftonline.com urn:federation:MicrosoftOnline ここで、%%%%項目を見れば、ADFS環境かどうかが分かります。\\ 上記の例ではtrueですので、ADFS環境になります。\\ また、%%%%項目のURLがSAML Security tokenを取得するために必要なURLになります。 ===== POC段階2 ===== SAML Security tokenを取得するために、前段階で取得した%%STSAuthURL%%宛にSOAPメッセージをPOST送信します。 SOAPメッセージ例を下に示します。 http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue http://www.w3.org/2005/08/addressing/anonymous https://xxxxx.contoso.com/adfs/services/trust/2005/usernamemixed %(username) %(userpass) urn:federation:MicrosoftOnline http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey http://schemas.xmlsoap.org/ws/2005/02/trust/Issue urn:oasis:names:tc:SAML:1.0:assertion ここで、%(username), %(userpass)には、ユーザーアカウント及びパスワードを代入します。\\ また、上記xmlを送信する際、Requestヘッダーに下記を追加します。 Content-Type:application/soap+xml; charset=utf-8 Responseのxmlから%%%%に囲まれる部分がSAML Security tokenです。\\ こちらのraw typeテキスト((Pretty typeではエラーになります。))がBinary token取得のために必要です。\\ SAML Security tokenの例は、内容が長いのと見てもチンプンカンプンなのでLOL割愛します。 ===== POC段階3 ===== Binary tokenを取得するために、前段階で取得したSAML Security tokenをSOAPメッセージとして下記URLにPOST送信します。 ((ここからは外部にアクセスするため、会社等のProxy環境にある場合は、Proxy認証が必要になります。)) https://login.microsoftonline.com/extSTS.srf SOAPメッセージの例を下に示します。 http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue http://www.w3.org/2005/08/addressing/anonymous %(samltoken) %(siteurl) http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey http://schemas.xmlsoap.org/ws/2005/02/trust/Issue urn:oasis:names:tc:SAML:1.0:assertion ここで、%(samltoken)には、SAML Security tokenをraw typeで代入します。\\ 続いて、%(siteurl)には、SharepointサイトURLを代入します。 また、上記xmlを送信する際、Requestヘッダーに下記を追加します。 Content-Type:application/soap+xml; charset=utf-8 Http送信の結果、xmlが帰ってくるのですが、%%%%に囲まれている長いテキストがBinary tokenです。\\ こちらのtokenはcookie取得のために必要です。 ===== POC段階4 ===== いよいよ最後の段階です。長い道のりでしたが、ここではcookieを取得する方法を見てみます。\\ 下記のURLに前段階で取得したBinary tokenをPOST送信します。 https://xxxx.sharepoint.com/_forms/default.aspx?wa=wsignin1.0 xxxxには、独自ドメイン(エイリアス)が入ります。\\ 正常の場合は、HTTP code=302(FOUND)が帰ってきます。\\ そして、下記の2つのcookieがResponseヘッダーに含まれているのが確認できます。((内容が長いため、一部分をカットしました。)) Set-Cookie: rtFa=I4phG2qFs+pUekvF4a03qJ0Pt79SUAzM3bLl5CMkZbgmODJDRjhFQjQtRTEzQi; path=/; SameSite=None; secure; HttpOnly Set-Cookie: FedAuth=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U1A+VjEwLDBoLmZ; path=/; SameSite=None; secure; HttpOnly こちらの取得したcookieを次のリクエストを送信する際、Cookieヘッダーに追加します。\\ 以降のRESTサービスへのリクエストは、認証cookieさえあれば利用可能です。 ===== Reference ===== * [[http://www.sharepoint-insight.com/2016/03/21/step-by-step-sharepoint-online-authentiaction-process-via-http-protocol/|Step-by-Step SharePoint Online Authentiaction Process via HTTP Protocol]] * [[https://sharepoint.stackexchange.com/questions/235083/how-to-send-an-sso-saml-assertion-to-sharepoint-online-to-get-fedauth-and-rtfa-c|How to send an SSO SAML assertion to Sharepoint Online to get FedAuth and rtFa cookies?]] * [[https://stackoverflow.com/questions/11295953/claim-auth-from-adfs|Claim auth from ADFS]] ~~DISCUSSION~~