- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-20-2022 08:00 PM
コミュニティの皆様
いつもお世話になっております。
私はGoogle Cloud Platformのサービスアカウントキーを使用して、
ServiceNowからGoogle Calaendarに接続できるかを調査しています。
背景としては、Goolgle Calendarへの接続はOAuth2.0クライアントIDで行っていましたが、
その場合だと1週間に1度手動で認証情報を手動で取得する必要があります。
この手間をなくすため、サービスアカウントキーを認証情報とて接続しているかを
調査しています。
試行錯誤の末、JWT Providerを使用して、アクセストークンを取得し、Google Calendarに接続できることを確認しましたが、リフレッシュトークンがなぜか生成されない状況です。
Now Supportのナレッジなども確認しましたが、関連するドキュメントがほとんどなく、
困っている状態なので、少しでも知見のある方はご教示して頂きたいです。
よろしくお願いいたします。
※以下はバックグラウンドスクリプトで試したコードになります。
アクセストークンは取得されていることがわかると思いますが、
リフレッシュトークンはNullが返されています。
var tokenRequest = new sn_auth.GlideOAuthClientRequest();
tokenRequest.setGrantType("urn:ietf:params:oauth:grant-type:jwt-bearer");
tokenRequest.setRequestor("google mail address");
var oAuthClient = new sn_auth.GlideOAuthClient();
// Google Calendar is Application Registy's Name
var tokenResponse = oAuthClient.requestTokenByRequest("Google Calendar", tokenRequest);
gs.info("Error:" + tokenResponse.getErrorMessage());
var token = tokenResponse.getToken();
if(token) {
gs.info("AccessToken:" + token.getAccessToken());
gs.info("AccessTokenExpiresIn:" + token.getExpiresIn());
gs.info("RefreshToken:" + token.getRefreshToken());
}
結果:
Getting JWTProvider for jwtProviderSysId = 68f7cb6687c0511006738517cebb3541
Getting JWTProviderConfig for jwtProviderId = 68f7cb6687c0511006738517cebb3541
Started to generate JWT
Successfully generated JWT
*** Script: Error:null
*** Script: AccessToken:ya29.c.b0AXv0zTPzDyRCOxnDDmH2Ozk7-XZeaun8B_hXC74z_TTI-ag56rn4-Aa5afaxetka5ZY8UcSDlXKDNzLt7_QWtWkvDtulfSVrbtI4k5TtXni8zXWFJIxSDb7CTusnY-Vs9FMIco-5bHR_H679aT1Q48iQlqh4dkmlfu2fPGx3GJIpyrydjOfTNDm7FsEmGYaJEmQIT-3zV6AHlSrMUgpMdEsKbcMj3Q.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
*** Script: AccessTokenExpiresIn:3599
*** Script: RefreshToken:null
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-27-2022 07:47 AM
サービスアカウントを利用した場合は、Refresh Tokenは使わないGoogleの仕様のようです。下記のGoogle公式ページを参照してください。サービスアカウントを使うならばScriptで毎回事前にScriptでAccessTokenを取得して利用するか、期限が切れるより短い間隔でScheduleJobを回してAccessTokenを取得し続ける方法になると思います。もしくはサービスアカウントではない接続方法ならRefresh Tokenを取得できる仕様のようです。
- サービスアカウント [一部抜粋]クライアント ID と秘密鍵を使用して署名付き JWT を作成し、適切な形式でアクセス トークン リクエストを作成します。アプリケーションは、トークン リクエストを Google OAuth 2.0 認証サーバーに送信します。このサーバーはアクセス トークンを返します。アプリケーションはこのトークンを使用して Google API にアクセスします。トークンの有効期限が切れると、アプリケーションはこのプロセスを繰り返します。
その他の接続方式にはRefresh Tokenを使った仕様になっています。
- ウェブサーバーアプリケーション
https://developers.google.com/identity/protocols/oauth2#webserver
[一部抜粋]Google がユーザー認証、セッション選択、ユーザーの同意を処理します。その結果、アプリケーションがアクセス トークンや更新トークンと交換できる認証コードが生成されます。アプリケーションは、今後の使用のために更新トークンを保存し、アクセス トークンを使用して Google API にアクセスする必要があります。アクセス トークンが期限切れになると、アプリケーションは更新トークンを使用して新しいトークンを取得します。

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-21-2022 05:15 PM
トークンURLをhttps://www.googleapis.com/oauth2/v4/tokenに更新してみてください。v3を使用していると、不明な問題が発生する可能性があります。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-23-2022 05:29 PM
ご回答が遅れてしまい、申し訳ありません。
トークンURLをhttps://www.googleapis.com/oauth2/v4/tokenに更新してみましたが、結果は変わらずでした。。
リフレッシュトークンの生成でスクリプトインクルードなど設定する必要があれば、ご教示して頂けないでしょうか。
よろしくお願いいたします。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-27-2022 07:47 AM
サービスアカウントを利用した場合は、Refresh Tokenは使わないGoogleの仕様のようです。下記のGoogle公式ページを参照してください。サービスアカウントを使うならばScriptで毎回事前にScriptでAccessTokenを取得して利用するか、期限が切れるより短い間隔でScheduleJobを回してAccessTokenを取得し続ける方法になると思います。もしくはサービスアカウントではない接続方法ならRefresh Tokenを取得できる仕様のようです。
- サービスアカウント [一部抜粋]クライアント ID と秘密鍵を使用して署名付き JWT を作成し、適切な形式でアクセス トークン リクエストを作成します。アプリケーションは、トークン リクエストを Google OAuth 2.0 認証サーバーに送信します。このサーバーはアクセス トークンを返します。アプリケーションはこのトークンを使用して Google API にアクセスします。トークンの有効期限が切れると、アプリケーションはこのプロセスを繰り返します。
その他の接続方式にはRefresh Tokenを使った仕様になっています。
- ウェブサーバーアプリケーション
https://developers.google.com/identity/protocols/oauth2#webserver
[一部抜粋]Google がユーザー認証、セッション選択、ユーザーの同意を処理します。その結果、アプリケーションがアクセス トークンや更新トークンと交換できる認証コードが生成されます。アプリケーションは、今後の使用のために更新トークンを保存し、アクセス トークンを使用して Google API にアクセスする必要があります。アクセス トークンが期限切れになると、アプリケーションは更新トークンを使用して新しいトークンを取得します。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-28-2022 10:15 PM
お忙しい中、ご回答頂きありがとうございます。
上記について承知しました。
試しにScheduled Jobを作成しましたが、うまくいきません。
詳細は再度質問を以下に投稿しましたので、
お手数をおかけしますが、ご確認して頂けないでしょうか。
よろしくお願いいたします。
https://community.servicenow.com/community?id=community_question&sys_id=b74586b6db5815102454e6be139619f3