【SPO】PnP ライブラリを使用して SharePoint Online のスクリプトをモダン認証 (先進認証) に対応させる方法
PnP のライブラリを使用して、SPO に対する CSOM 実行をモダン認証に対応させる方法をまとめます。
SPO で、レガシー認証をブロックする設定とした場合、SharePointOnlineCredentials クラスの認証を使用したスクリプトもブロックされます。
0 個の引数を指定して "ExecuteQuery" を呼び出し中に例外が発生しました: "Cannot contact web site 'https://contoso.sharepoint.com/' or the web site does not support SharePoint Online credentials.
対処方法
モダン認証を使用した認証方法への変更として、最も簡単と考えられる方法は、PnP ライブラリの AuthenticationManager クラスの GetWebLoginClientContext メソッドを使用する方法です。
必要な対応は、PnP Core のライブラリを読み込むことと、数行のコード変更です。
サンプルコードは下記 Microsoft の開発チームのブログでも紹介されています。
注意点
注意点として、この方法は実行の度に資格情報を入力するダイアログが表示されるため、バッチ処理などの無人実行のスクリプトには対応できません。
無人実行のためのスクリプトをモダン認証に対応させるには、Azure AD 上に作成したサービス プリンシパル (アプリ用の実行アカウント) を使用した証明書認証などが必要となります。
(次回はここの内容を書こうかと思います。)
手動で実行しているスクリプトであれば、GetWebLoginClientContext メソッドへの置き換えが簡単かと思います
以下にサンプルを示して終わります。
サンプルの紹介
事前準備として、SharePointPnPPowerShellOnline をインストールします。
Install-Module SharePointPnPPowerShellOnline
Import-Module SharePointPnPPowerShellOnline
以下呼び出しのサンプルコードです。
従来の SharePointOnlineCredentials クラスを使用し、サイト名をコンソールに表示するサンプル
$siteUrl = "https://contoso.sharepoint.com/sites/site01";
$username = "admin@contoso.onmicrosoft.com";
$password = "password";
$secpass = convertto-securestring $password -AsPlainText -Force
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $secpass);
$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
$clientContext.Credentials = $credentials
$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery();
Write-Host $clientContext.Web.Title
実行時に資格情報を入力するダイアログが表示されるので、ID と パスワードを入力する必要があります。$siteUrl = "https://contoso.sharepoint.com/sites/test01"
$authManager = new-object OfficeDevPnP.Core.AuthenticationManager;
$clientContext = $authManager.GetWebLoginClientContext($siteUrl);
$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery();
Write-Host $clientContext.Web.Title
おわりに
PnP のライブラリやコマンドは、どんどん開発が進んでいて、ほんとに便利になっています。CSOM で一から実装しなくとも、大抵 PnP 側で用意されていることが多いです。不具合報告などは直接コミュニティに問い合わせる必要がありますが、ぜひたくさん使って、フィードバックしていきましょう。
CSOM モジュールのパッケージ管理や PnP コミュニティについては、下記記事をご参考ください。