curl という様々なプロトコルで要求を送信できるコマンド ライン ツールを使って、SharePoint Online の REST API を呼び出すことができないかな?と思い試してみました。方法さえ覚えておけば REST API の検証がお手軽にできるかも?と思ったので、ややこしい認証まわりを中心にメモを残しておきます。

curl の入手はこちらから。クライアント環境が 64bit の Windows だったので「Download」のページの「Win64 – Generic」から「Win64 2000/XP x86_64 MSI」をダウンロードしてインストールしています。

curl and libcurl
https://curl.haxx.se/

環境について

説明を進める上で、下記の通り環境を仮定します。

SharePoint URL https://tenant.sharepoint.com
User Name user@tenant.onmicrosoft.com
Password Passw0rd!

認証手順

まずは、SharePoint Online へリクエストを行い RpsContextCookie を取得します。

curl -i -X POST -H "Content-Length:0" -c cookie1.txt "https://tenant.sharepoint.com/_layouts/Authenticate.aspx?Source="

実行すると cookie1.txt に RpsContextCookie が格納されるので、次はそれを使って Office 365 の STS へ SAML リクエストを行います。ちょっと分かりづらいですが、コマンドのオプションに指定している XML の中に Username、Password と、EndPoint の Address があるので、それぞれの環境に合わせて書き換えます。

curl -i -X POST -b cookie1.txt -d "<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope' xmlns:a='http://www.w3.org/2005/08/addressing' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'><s:Header><a:Action s:mustUnderstand='1'>http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand='1'>https://login.microsoftonline.com/extSTS.srf</a:To><o:Security s:mustUnderstand='1' xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'><o:UsernameToken><o:Username>user@tenant.onmicrosoft.com</o:Username><o:Password>Passw0rd!</o:Password></o:UsernameToken></o:Security></s:Header><s:Body><t:RequestSecurityToken xmlns:t='http://schemas.xmlsoap.org/ws/2005/02/trust'><wsp:AppliesTo xmlns:wsp='http://schemas.xmlsoap.org/ws/2004/09/policy'><a:EndpointReference><a:Address>https://tenant.sharepoint.com/</a:Address></a:EndpointReference></wsp:AppliesTo><t:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</t:KeyType><t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType><t:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</t:TokenType></t:RequestSecurityToken></s:Body></s:Envelope>" "https://login.microsoftonline.com/extSTS.srf"

このレスポンスとして XML が返ってくるので、その中から <wsse:BinarySecurityToken Id="Compact0"> を探し、この BinarySecurityToken をメモしておきます。ドラクエのふっかつのじゅもんを思い出しますね。メモしたもののサンプルが下記です。

"t=EwAoA06hBwAUNfDkMme61kIdXqvj9tWnUbHtXWEAAX/dzAV3qKsNmyl6otuAux8+BmHuN+xS9xjU/Iz+KPPcQe4CXRLvzH5Z0xFYmZVsHYOAG063s+yYNTk3jtp6kMzuOlIEBPDxcu21WZYLYAm/O9KLjLLBCJWWwpFlnsnSCIa9GLmrDzNljwFI44fQ/aRTz06MuWUSVA3PfXU2ojqVmV33Zm936zhGtg5+ZD8BqpJK/h665KlAZ6/cR1MaUYgvbZxB+Ewbbh78IaCR/qfOTXlEcYnweCgYIQvztVbhIVG8odVGXTB3RXC/jI4Y6InMfuN2fR1y4RE2rBCjOTSiF0oGaULCYlEnFfyb3gl4iT1bV1fMXYCJnC/6j15Q2zcDZgAACE0js/MdmYDe+AGzTJKfKxJ/YqSAy3pClPWgiQwXytP5BcnTTzJXyOj8aAb4GuDHUWqSy2J1YEhKpLnBdaZ9HfCnqtYsyTSexuM7e+LXzSglOk7mAOixrPlRGLpviZyXm9dg3+FnQ3PdqkoJMJUuuihVkTq4Og/2viWk0ip9Mc6pLS855sDES70D3Q/xl8BNCrUHPHIMrHU0Kbenr1tC7jaKs7mUr0de0Gjp5GMvNL5TDjKEe6SEwmDFLWXcIfrIHIp4K7xeGf5O5C5eN6EiccoVkJYm/Srq1JZpdTTP44us2mS7wgzSy/qrOrDbIR/CO007GXxKBNhRowMZSxS0SnOGb8Cn6P4bKWc5+YqLOIve/0kcQNtgUkP6LsenvuG0JM2KCFylpXCBut/2Z6l5aWVho1jqn5O2IA1Gws7ZlOQHjY0S7pR+FkSVGFad+x6JUe6mFzVrsW0bg3vvkChgC5gLb8jeEn1rnBSSCnPZqsMkQFsPd9RfLwZGDWIAOYAtEuJ3teepT/W/44oXCKF1SI3CIqRGUkofiRX8sl3qHZwNpGmKN7dh34Ci3AD9xiRl7NjW23lw1IWmfQh7XHSieFFYRCEUPc5DU3RykrfwLcgnqmaBpb4veAclpBoIkT7suGgF957USbT4FOlB0s9IiHOPfgbahK+xq/kIVPoP7KAwD4RfAg==&amp;p="

次はこの BinarySecurityToken を使って SharePoint Online へ認証リクエストを行ない、Authentication Cookie を取得します。

curl -i -X POST -d "t=EwAoA06hBwAUNfDkMme61kIdXqvj9tWnUbHtXWEAAX/dzAV3qKsNmyl6otuAux8+BmHuN+xS9xjU/Iz+KPPcQe4CXRLvzH5Z0xFYmZVsHYOAG063s+yYNTk3jtp6kMzuOlIEBPDxcu21WZYLYAm/O9KLjLLBCJWWwpFlnsnSCIa9GLmrDzNljwFI44fQ/aRTz06MuWUSVA3PfXU2ojqVmV33Zm936zhGtg5+ZD8BqpJK/h665KlAZ6/cR1MaUYgvbZxB+Ewbbh78IaCR/qfOTXlEcYnweCgYIQvztVbhIVG8odVGXTB3RXC/jI4Y6InMfuN2fR1y4RE2rBCjOTSiF0oGaULCYlEnFfyb3gl4iT1bV1fMXYCJnC/6j15Q2zcDZgAACE0js/MdmYDe+AGzTJKfKxJ/YqSAy3pClPWgiQwXytP5BcnTTzJXyOj8aAb4GuDHUWqSy2J1YEhKpLnBdaZ9HfCnqtYsyTSexuM7e+LXzSglOk7mAOixrPlRGLpviZyXm9dg3+FnQ3PdqkoJMJUuuihVkTq4Og/2viWk0ip9Mc6pLS855sDES70D3Q/xl8BNCrUHPHIMrHU0Kbenr1tC7jaKs7mUr0de0Gjp5GMvNL5TDjKEe6SEwmDFLWXcIfrIHIp4K7xeGf5O5C5eN6EiccoVkJYm/Srq1JZpdTTP44us2mS7wgzSy/qrOrDbIR/CO007GXxKBNhRowMZSxS0SnOGb8Cn6P4bKWc5+YqLOIve/0kcQNtgUkP6LsenvuG0JM2KCFylpXCBut/2Z6l5aWVho1jqn5O2IA1Gws7ZlOQHjY0S7pR+FkSVGFad+x6JUe6mFzVrsW0bg3vvkChgC5gLb8jeEn1rnBSSCnPZqsMkQFsPd9RfLwZGDWIAOYAtEuJ3teepT/W/44oXCKF1SI3CIqRGUkofiRX8sl3qHZwNpGmKN7dh34Ci3AD9xiRl7NjW23lw1IWmfQh7XHSieFFYRCEUPc5DU3RykrfwLcgnqmaBpb4veAclpBoIkT7suGgF957USbT4FOlB0s9IiHOPfgbahK+xq/kIVPoP7KAwD4RfAg==&amp;p=" -c cookie2.txt "https://tenant.sharepoint.com/_forms/default.aspx?wa=wsignin1.0"

ここまで来ると、cookie2.txt に SharePoint Online の REST API を呼び出すための rtFa、FedAuth が揃うので、いよいよこれを使って SharePoint Online の REST API を呼び出すことができます。

SharePoint Online REST API の呼び出し

下記の例では、/sites/teamsite というパスにあるサイトの「Discussions」という名前のリストの情報を取得しています。また、レスポンスが長くなるので、結果を output.txt へ書き出しています。

curl -i -X GET -b cookie2.txt -o output.txt "https://tenant.sharepoint.com/sites/teamsite/_api/web/lists/getbytitle('Discussions')"

うまくいっていれば output.txt へ REST API からのレスポンス結果が入っているはずです。

さいごに

curl はかなり柔軟にいろいろな要求を作成することができますし、Web アプリケーションの開発や検証を行う場合はとても役に立ちます。今回は、せっかくなので SharePoint Online の開発でも使いたい!と思い試してみました。ついでに SharePoint Online への認証フローも整理できたので、一石二鳥となりました。