The CreatorCon Call for Content is officially open! Get started here.

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