SharePointOnlineモダンサイトの色を変える


会社のロゴの色に合わせたいのですが、標準では用意されていませんね。ということでカスタマイズをしたいと思います。

# SharePoint Online Management Shellは32ビットPCでは利用できないようです。

以下を参考に...

+ [SharePointOnlineモダンサイトの色をカスタマイズしてみる](https://deepcom.co.jp/customthemecolor/)

まずはSharePoint Online Management Shellをインストールと思いまして...
いきなりアウトです。ああ32ビットマシーンだったわ。インストールできないですね。

と思いましたが、もしかしてPowerShell 3.0がない？

もう一度やってみたけど、やっぱり64ビットしか機能しないようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b6144fa7-afec-972c-d0ca-a75069b157ae.png)

ああ、REST APIになるなぁ。
取りあえず、色の定義ファイルだけは作っておきます。

+ [Fluent UI Theme Designer](https://fluentuipr.z22.web.core.windows.net/heads/master/theming-designer/index.html)
+ [RGB to HEX Color Converter](https://www.rgbtohex.net/)

```
{
  "themePrimary": "#139244",
  "themeLighterAlt": "#f2fbf5",
  "themeLighter": "#ccedd9",
  "themeLight": "#a4deba",
  "themeTertiary": "#5abd80",
  "themeSecondary": "#259f54",
  "themeDarkAlt": "#11833d",
  "themeDark": "#0e6e33",
  "themeDarker": "#0b5126",
  "neutralLighterAlt": "#faf9f8",
  "neutralLighter": "#f3f2f1",
  "neutralLight": "#edebe9",
  "neutralQuaternaryAlt": "#e1dfdd",
  "neutralQuaternary": "#d0d0d0",
  "neutralTertiaryAlt": "#c8c6c4",
  "neutralTertiary": "#a19f9d",
  "neutralSecondary": "#605e5c",
  "neutralSecondaryAlt": "#8a8886",
  "neutralPrimaryAlt": "#3b3a39",
  "neutralPrimary": "#323130",
  "neutralDark": "#201f1e",
  "black": "#000000",
  "white": "#ffffff"
}
```

# 仕方ないのでREST API　をやってみよう。

まったく仕様を理解していないのでエラーが出た時に分かりやすいようにCURLコマンドを使って接続してみたいと思います。接続方法が分かればApexからコールアウトしてもいいかもしれません。（他の言語を最近触ってないのでよく分からん）

以下を参考にさせていただきました。

+ [curl コマンド ライン ツールで SharePoint Online REST API を呼び出す](https://idea.tostring.jp/?p=2080)


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

正直結果を見てもよく分かりません。cookie1.txtができてました。(コードブロックを使うとスクロールされて一覧性が損なわれるので今回は使いません)

:::note
curl -i -X POST -H "Content-Length:0" -c cookie1.txt "https://[ここを変える].sharepoint.com/_layouts/Authenticate.aspx?Source="
:::

もしかして、httpsで接続できてないと思って以下を試しましたが、効果があったのかは全く分かりません。変わったような感じはないですね。

:::note
/usr/bin/curl -s -S -tlsv1.2 --cacert ./cacert.pem --compressed -i -X POST -H "Content-Length:0" -c cookie1.txt "https://[ここを変える].sharepoint.com/_layouts/Authenticate.aspx?Source="
:::


>実行すると cookie1.txt に RpsContextCookie が格納されるので、次はそれを使って Office 365 の STS へ SAML リクエストを行います。

一覧性がないですが、どうしてもうまく表示できないのでコードブロック使っています。
```
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>[ログイン名]</o:Username><o:Password>[パスワード]</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 をメモしておきます。ドラクエのふっかつのじゅもんを思い出しますね。メモしたもののサンプルが下記です。

:::note
<?xml version="1.0" encoding="utf-8"?><S:Envelope xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:S="http://www.w3.org/2003/05/soap-envelope"><S:Header><wsa:Action S:mustUnderstand="1" wsu:Id="Action">http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue</wsa:Action><wsa:To S:mustUnderstand="1" wsu:Id="To">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To><wsse:Security S:mustUnderstand="1"><wsu:Timestamp wsu:Id="TS" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><wsu:Created>2022-12-26T07:53:10.2864797Z</wsu:Created><wsu:Expires>2022-12-26T07:58:10.2864797Z</wsu:Expires></wsu:Timestamp></wsse:Security></S:Header><S:Body xmlns:S="http://www.w3.org/2003/05/soap-envelope"><wst:RequestSecurityTokenResponse xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust"><wst:TokenType>urn:passport:compact</wst:TokenType><wsp:AppliesTo><wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Address>https://tenant.sharepoint.com/</wsa:Address></wsa:EndpointReference></wsp:AppliesTo><wst:Lifetime><wsu:Created>2022-12-26T07:53:10Z</wsu:Created><wsu:Expires>2022-12-27T07:53:10Z</wsu:Expires></wst:Lifetime><wst:RequestedSecurityToken><wsse:BinarySecurityToken Id="Compact0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">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=</wsse:BinarySecurityToken></wst:RequestedSecurityToken><wst:RequestedAttachedReference><wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:Reference URI="674CELBnSC9TetXYPqbN7OIRqbw="></wsse:Reference></wsse:SecurityTokenReference></wst:RequestedAttachedReference><wst:RequestedUnattachedReference><wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:Reference URI="674CELBnSC9TetXYPqbN7OIRqbw="></wsse:Reference></wsse:SecurityTokenReference></wst:RequestedUnattachedReference></wst:RequestSecurityTokenResponse></S:Body></S:Envelope>
:::


:::note
"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 を取得します。

:::note
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://[ここを変える].sharepoint.com/_forms/default.aspx?wa=wsignin1.0"
:::

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

# ここから、本当に使えるのかを確かめたいけど.... 

+ [SharePoint REST サービスの概要](https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/get-to-know-the-sharepoint-rest-service?tabs=csom)
+ [REST API を使用して SharePoint リストを操作する方法](https://ez-office.jp/blog/detail/20211102-02)

この２つ目をみると色々有益なエンドポイントが書かれているなぁ。

:::note
curl -i -X POST -H "Content-Length:0" -b cookie2.txt "https://[ここを変える].sharepoint.com/sites/teamsite/_api/contextinfo"
:::

大事なのはここだな。おお、Titleが取得できたようです。　こんな感じで使えるのかもしれませんね。

<d:Title > FKD Portal Site</d:Title>

```
<?xml version="1.0" encoding="utf-8"?><d:Title xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">FKD Portal Site</d:Title>
```