GASからMicrosoft Graph APIを呼び出すテストをしております。
環境
- スプレッドシートは使用せず、スタンドアロンのスクリプトで構成
- 無料Googleアカウントで開発(以下、アカウント名dev)
- WEBアプリケーションとしてデプロイ
- 次のユーザーとして実行:自分
- アクセスできるユーザー:全員
- プロジェクトの共有:(アクセスできるユーザー:自分/一般的なアクセス:リンクを知っている全員)
- Windows 11 chromeおよびEdge
- OAuth2.0ライブラリをプロジェクトに登録
前提
function doGet() {
return HtmlService.createHtmlOutput("hellow world");
}
上記コードのみの場合、開発中のブラウザでdevアカウントでログインしている場合、結果は正常です。
また、Cookieやキャッシュをクリアした他のchromeやEdgeでも正常です。
chromeはゲストで使用していますが正常です。Googleアカウントを求められたりはしません。
以上の前提から、実行権限は問題ないと判断しております。
事象
下記のコードでデプロイしたGASを実行すると、開発しているブラウザの別タブでの実行時のみ正常で、他はパターンごとに結果が異なります。
正常なパターン
Microsoftアカウント要求画面->アカウント認証->「OAuth2;認証が必要です」のリンクをクリック->「認証に成功しました。ページを閉じてください」が表示される
パターン1.chromeをゲストアカウントで使用している場合
Microsoftアカウント要求画面->アカウント認証->「OAuth2;認証が必要です」のリンクをクリック->MS認証に成功し「サインインの状態を保持しますか?」のポップアップを「はい」-> Googleアカウントの要求->Googleアカウントで認証-> Google Apps Scriptのロゴが左上にあるページで、”トークンが無効か、有効期限が切れています。もう一度お試しください。”でエラー終了
パターン2.chromeにgoogleアカウントAやBでログインしている場合
Microsoftアカウント要求画面->アカウント認証->「OAuth2;認証が必要です」のリンクをクリック->MS認証に成功し「サインインの状態を保持しますか?」のポップアップを「はい」-> Google Apps Scriptのロゴが左上にあるページで、”トークンが無効か、有効期限が切れています。もう一度お試しください。”でエラー終了
パターン1とパターン2の違いはGoogleサインインを求められるか否かです。
不明点
- なぜ上記doGetと下記のdoGetで、Googleアカウントが必要であったり不要であったりするのか
- MS Azure側のアプリケーションのサインインログでは、いずれも認証は成功となっているが、開発しているブラウザ以外での実行では、
”トークンが無効か、有効期限が切れています。もう一度お試しください。”で終了するのか。
コード
var CLIENT_ID = "xxxxxxxxxxxxxxxxxx";
var CLIENT_SECRET = "xxxxxxxxxxxxxxxxxxxxxxx";
var scopes = "User.Read offline_access";
// function doGet() {
// return HtmlService.createHtmlOutput("hellow world");
// }
function doGet(){
var service = getService();
if (service.hasAccess()) {
return HtmlService.createHtmlOutput('Success');
}
var authorizationUrl = service.getAuthorizationUrl();
var template = '<a href="' + authorizationUrl + '" target="_blank">OAuth2 認証が必要です</a>';
return HtmlService.createHtmlOutput(template);
}
function getService() {
return OAuth2.createService("Microsoft Graph")
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setScope(scopes)
.setCallbackFunction("authCallback")
.setPropertyStore(PropertiesService.getUserProperties())
.setParam("response_type", "code");
}
function authCallback(request) {
var service = getService();
var isAuthorized = service.handleCallback(request);
if (isAuthorized) {
return HtmlService.createHtmlOutput("認証に成功しました。ページを閉じてください。");
} else {
return HtmlService.createHtmlOutput("認証に失敗しました。Cookieを削除するか管理者に問い合わせしてください。");
}
}
パターン1の結果
パターン2の遷移
Google認証後、トークンが無効・・・のエラーとなります。