JWTのRefresh Tokenについて

Ereshkigal
Tera Contributor

コミュニティの皆様
いつもお世話になっております。

私は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
1 ACCEPTED SOLUTION

iwai
Giga Sage

サービスアカウントを利用した場合は、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 にアクセスする必要があります。アクセス トークンが期限切れになると、アプリケーションは更新トークンを使用して新しいトークンを取得します。

View solution in original post

4 REPLIES 4

Richard Tamparo
Mega Guru

トークンURLをhttps://www.googleapis.com/oauth2/v4/tokenに更新してみてください。v3を使用していると、不明な問題が発生する可能性があります。

ご回答が遅れてしまい、申し訳ありません。

トークンURLをhttps://www.googleapis.com/oauth2/v4/tokenに更新してみましたが、結果は変わらずでした。。

リフレッシュトークンの生成でスクリプトインクルードなど設定する必要があれば、ご教示して頂けないでしょうか。

よろしくお願いいたします。

iwai
Giga Sage

サービスアカウントを利用した場合は、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 にアクセスする必要があります。アクセス トークンが期限切れになると、アプリケーションは更新トークンを使用して新しいトークンを取得します。

Ereshkigal
Tera Contributor

お忙しい中、ご回答頂きありがとうございます。
上記について承知しました。

試しにScheduled Jobを作成しましたが、うまくいきません。
詳細は再度質問を以下に投稿しましたので、
お手数をおかけしますが、ご確認して頂けないでしょうか。

よろしくお願いいたします。

https://community.servicenow.com/community?id=community_question&sys_id=b74586b6db5815102454e6be139619f3