SharePoint REST API で疎通をしよ~
1.クライアントの登録(アドイン登録)
ブラウザ上で、{site collection url}/_layouts/15/AppRegNew.aspx にアクセス
例) https://test.sharepoint.com/sites/food/_layouts/15/appregnew.aspx
・クライアントID:生成ボタンを押すと自動生成される
・クライアントシークレット:生成ボタンを押すと自動生成される
・タイトル:トークン取得時の同意画面表示されるクライアントの名前
・アプリドメイン:localhostでも良いし、samiii.co.jp のようなドメインでも
・リダイレクト先URL:redirect_uri ここに code が送付される
2.クライアントが扱うスコープの登録(作成したアプリに権限を付与する)
ブラウザ上で、 {site collection url}/_layouts/15/appInv.aspx にアクセス
例) https://test.sharepoint.com/sites/food/_layouts/15/appinv.aspx
・アプリID:「②クライアントの登録(アドイン登録)」で登録したクライアントID
・タイトル:アプリIDを入力し [参照]を押下すると登録されている内容が自動で表示される
・アプリドメイン:アプリIDを入力し [参照]を押下すると登録されている内容が自動で表示される
・リダイレクト先:アプリIDを入力し [参照]を押下すると登録されている内容が自動で表示される
・権限の要求XML:権限の詳細は下記参照
→アドインのアクセス許可とアクセス許可スコープの種類
3.登録したクライアント(アドイン)の確認
ブラウザ上で、 {site collection url}/_layouts/15/AppPrincipals.aspx にアクセス
例) https://test.sharepoint.com/sites/food/_layouts/15/AppPrincipals.aspx
・登録したクライアント(アドイン)のタイトル表示されていること
※登録したクライアントの削除は、左側の「✘」をクリックすると削除可能。
・アプリIDの@以降がテナント識別子になる
アクセストークン取得時にテナント識別子が必要になる
4.認可コードの取得
認可エンドポイントを実行
ブラウザ上で、{site collection url}/_layouts/15/OAuthAuthorize.aspx
そこに、下記パラメータを付しGETリクエストを送付しアクセス
・response_type:許可コードを要求する値。Oauth認証2.0の仕様で定義されている値
・client_id:「①クライアントの登録(アドイン登録)」で登録したクライアントID
・redirect_uri:「①クライアントの登録(アドイン登録)」で登録したリダイレクト先URI
https://test.sharepoint.com/sites/food/_layouts/15/OAuthAuthorize.aspx?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}
※リダイレクト先のuriが存在しない場合、アクセスできませんと表示されると思うが、
?code= ~~~~が認可コードですので問題ないです。
5.認可コード grantでアクセストークンを取得する
トークンエンドポイント、https://accounts.accesscontrol.windows.net/{テナント識別子}/tokens/OAuth/2
そこに、下記パラメータを付しPOSTリクエストを送付する
・grant_type:認可コード grant であることを示す値。Oauth2.0仕様で定義されている値
・client_id:「①クライアントの登録(アドイン登録)」で登録したクライアントID + "@" + テナント識別子
・client_secret:「①クライアントの登録(アドイン登録)」で登録したクライアントシークレット
・redirect_uri:「①クライアントの登録(アドイン登録)」で登録したリダイレクト先URL
・resource:"00000003-0000-0ff1-ce00-000000000000/{SharePointドメイン名}@" + テナントの識別子
・code:「④認可コード取得」で取得した認可コード
※00000003-0000-0ff1-ce00-000000000000SharePoint Onlineを表すPrincipal
6.PowerShell からアクセストークンを取得
# アクセストークンを取得するためのOAuth 2.0リクエストを作成
$tokenRequest = @{
Uri = "https://accounts.accesscontrol.windows.net/{テナント識別子}/tokens/OAuth/2"
Method = "POST"
ContentType = "application/x-www-form-urlencoded"
Body = @{
grant_type = "authorization_code"
client_id = "{client_id}"
client_secret = "{client_secret}"
redirect_uri = "https://test.co.jp/oauth2/redirect_uri"
resource = "00000003-0000-0ff1-ce00-000000000000/test.sharepoint.com@{テナント識別子}"
code = "PAQABAAEAAAAmoFfGtYxvRrNriQdPKIZ-A4UHw3KvFiPrJNMWGeVkGAzqiV9vqQRNkeSAZJyF3fGfZWJ74JbKuo6g036tdNORwRgg9lF6VrUj71nVz7QuoP01oAqvo-P9iTxqNz4gDQAHhR0b_nzbnt0EOr9QuiNpgtEEwldvybX00gk-nSUfeEkFbVIAu68CNrlCyaPo0kGhnnjz_wLTLR60bI5qp0Yc-INC7TU19WXs7iOlOJVPZx7eXF0YP-ZCG-h3CFT4djhN_eEaAEhgRM_TNPCEOJmvE3lKqZEuGCjrbtMwRx5wu6FXUKz1jQXvj80AvXhab41MW8xGzQBrI_DwPhUR7aMEytmQdPtmTr8aXM1rPqMKDF-9s8brxA-xk3vayp3NLwMgAA"
}
}
# リクエストを送信し、レスポンスを取得
$response = Invoke-WebRequest @tokenRequest
# レスポンスの内容を表示
$response.Content
{"token_type":"Bearer","expires_in":"28799","not_before":"1699489003","expires_on":"1699518103","resource":"00000003-0000-0ff1-ce00-000000000000/nishiyamasniscorp.sharepoint.com@31234f36-91b6-4e43-afcb-2567c8c0dcd3","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjlHbW55RlBraGMzaE91UjIybXZTdmduTG83WSIsImtpZCI6IjlHbW55RlBraGMzaE91UjIybXZTdmduTG83WSJ9.eyJhdWQiOiIwMDAwMDAwMy0wMDAwLTBmZjEtY2UwMC0wMDAwMDAwMDAwMDAvbmlzaGl5YW1hc25pc2NvcnAuc2hhcmVwb2ludC5jb21AMzEyMzRmMzYtOTFiNi00ZTQzLWFmY2ItMjU2N2M4YzBkY2QzIiwiaXNzIjoiMDAwMDAwMDEtMDAwMC0wMDAwLWMwMDAtMDAwMDAwMDAwMDAwQDMxMjM0ZjM2LTkxYjYtNGU0My1hZmNiLTI1NjdjOGMwZGNkMyIsImlhdCI6MTY5OTQ4OTAwMywibmJmIjoxNjk5NDg5MDAzLCJleHAiOjE2OTk1MTgxMDMsImFjdG9yIjoiYzliODA4NmQtMGFmZi00MWY3LWJlMTgtYWEyNzdhM2JkZWJhQDMxMjM0ZjM2LTkxYjYtNGU0My1hZmNiLTI1NjdjOGMwZGNkMyIsImlkZW50aXR5cHJvdmlkZXIiOiJ1cm46ZmVkZXJhdGlvbjptaWNyb3NvZnRvbmxpbmUiLCJuYW1laWQiOiIxMDAzMjAwMkZDNTY2QzcxIn0.tHY6kyWdaTL5yA_o8FH01Ira4j7kcx7NUkJS-FBI2u7_DwXa6W5kFIXpzZdNVl2Hmb9o3kfFFMbQ8sx9OPfrH5ooiS5b7yJTadM2w_KCIgYQm_c8w4Z6i-CJqGNNr5SaYWNxO5sd3sdGdx6OA9Ch_52mauo3yTkb_f0lLd5fgbAwnglXODAnREQphZX1vmXOBCDTxX5BMQ3U3QJ5tz920VKoqU_DTAmtrlBi9JuGEj0yZJnpbX9ikDJZqlNLkHmKL2hR8eXGXobYJh-6XR5OSlfiJenTQ7SamcgPqjdR9uX8Wjw2RgTiVweVtfemAq9-ykNCmkc67eTYxDNXBMaBZQ","refresh_token":"PAQABAAEAAAAmoFfGtYxvRrNriQdPKIZ-t-w_3ik9v-qdqX7CwEajPa4PW66zmZ9Giqj3-EN8ZloVCF4AmPpiL8URfYUNoeWRWyGp8SwB_n73ph1znEV0qvtVzp9sBiv4pXZe54RFVdYq4X0RkmK-dPiszDmdrWikkuxusa_a7EkvHeP3k8Q1J4bAf_Bjz64ZIj8KRlU1u6Rn7p_rYZLk4_Jz1j4rc_Rru8eKrVtK96TFELIWgQ-vhc5VxO_WXKP_asjZUxzCekn-dEQmYQbHAlfxXWOOZKxp02JoXMfuTXXBWGzCFUfK0yAA"}
grant_type = "authorization_code" の場合、リフレッシュトークンが発行されます。
上記のアクセストークンの有効期限は8時間のため、同じクライアント情報から取得したい場合は、
リフレッシュトークンを使おう!
# リフレッシュトークンを用い、アクセストークンを取得するためのOAuth 2.0リクエストを作成
$tokenRequest = @{
Uri = "https://accounts.accesscontrol.windows.net/{テナント識別子}/tokens/OAuth/2"
Method = "POST"
ContentType = "application/x-www-form-urlencoded"
Body = @{
grant_type = "refresh_token"
refresh_token = "PAQABAAEAAAAmoFfGtYxvRrNriQdPKIZ-tZ5b2dQTkq37cT6m1qgrJZIMiXCFX3fAI9zE9MNR-F1AbxYHq-GQJ7uKSW4m09nAsjc1ckawXkSxHkmMtDH0OewJYt_i809WCWXXzOMwIkaHjWUoRf-eoW_kaKII5BGqWwYcsJJWvXs2P8yhlG0SlyrAXUum6WmxWHolPsaBOcABteVqg6mHXcE-Mk4E1XpNyjZ5OPWEsGj59P3OxTNvlrcu5I5T8_SJuW4EgS3zKoymtQ5N0mYbDVHmDjXujiGzxvqwh8E49x_sKrVB23gthSAA"
client_id = "{client_id}"
client_secret = "{client_secret}"
redirect_uri = "https://test.co.jp/oauth2/redirect_uri"
resource = "00000003-0000-0ff1-ce00-000000000000/test.sharepoint.com@{テナント識別子}"
}
}
# リクエストを送信し、レスポンスを取得
$response = Invoke-WebRequest @tokenRequest
# レスポンスの内容を表示
$response.Content
参考
- SharePoint API の accessToken どうやって取る?【前編】
- SharePoint API の accessToken どうやって取る?【後編】
- アドインのアクセス許可とアクセス許可スコープの種類
著者: E.R (株式会社ウィズツーワン)






