Googleアカウントを持たない場合のGASの実行権限について

2,469 views
Skip to first unread message

gp熊谷

unread,
Sep 9, 2022, 12:08:11 AM9/9/22
to Google Apps API Japan
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&nbsp;認証が必要です</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の結果
ga_login.png

パターン2の遷移
pg1.png
msOK.png
glogin.png
Google認証後、トークンが無効・・・のエラーとなります。

gp熊谷

unread,
Sep 9, 2022, 1:04:49 AM9/9/22
to Google Apps API Japan
検証中ですが、
パターン1(ゲスト)で、MSアカウントの認証後に表示されるGoogle認証で、開発したアカウントでサインインすると期待した結果が得られました。

「次のユーザーとして実行」で”自分”としてあるため、そのアカウントであるかどうかのGoolge認証ということのようです。
開発したアカウント以外ではトークンの取得に失敗しているという理解です。

この場合、デプロイの際、「次のユーザーとして実行」を”ウェブアプリケーションにアクセスしているユーザー”とすればよさそうですが、
社内で使用する場合、必ず実行者がGoogleアカウントを所有していることはないため、「アクセスできるユーザー」を”自分”とした場合、
利用が制限される(実行できない)ということになります。

次のユーザーとして実行:ウェブアプリケーションにアクセスしているユーザー
アクセスできるユーザー:自分
としてデプロイし検証した結果、chromeをゲストで開きウェブアプリケーションを呼び出すと、すぐにgoogleアカウントを求められました。

Googleアカウントをもたない実行者でのアクセストークンの処理はできない!という認識ですが、この認識でよろしいでしょうか。



2022年9月9日金曜日 13:08:11 UTC+9 gp熊谷:
Reply all
Reply to author
Forward
0 new messages