CookBook

OAuth2.0 の アクセストークンを Google から取得する方法

投稿日:

このクックブックでは、OAuth2.0 の アクセストークンを Google から取得する方法を説明します。

intra-mart Accel Platformでは、OAuth2.0 の アクセストークンをユーザ毎に取得・保存する機能が備わっています。主な機能は以下のとおりです。

  • 初回のアクセストークン取得に必要な、認可要求に関する一連の画面や処理を共通化して提供
  • アクセストークンの有効期限が切れていた場合、リフレッシュトークンを利用して自動的にアクセストークンを更新

これにより、開発者は、OAuth2.0関連の面倒な実装をすることなく、外部のサービスが提供する様々な Web API へのアクセスを簡単に作成することが可能となります。

今回は、Google Drive™ のファイル一覧を取得することを例として、詳細な手順を説明します。

完成サンプル

以下の完成サンプルをダウンロードしてご活用ください。

e builder プロジェクト : im_cookbook_113639_e_builder_prj.zip
imm ファイル : im_cookbook_113639_oauth_client_google-1.0.0.imm

なお、ベースURLである以下の部分は、環境に合わせて適宜変更してください。
http://localhost:8080/imart

レシピ

概要

Google側の手順

  • 手順1. アプリケーション登録 - OAuth 2.0 クライアント ID の作成

intra-mart Accel Platform側の手順

  • 手順2. OAuthプロバイダ設定の作成。(/conf/oauth-provider-config/*.xmlの作成)
  • 手順3. 認可コード要求時のパラメータをGoogle用にカスタマイズ。(Google用のAuthzCodeRequestクラスの作成)
  • 手順4. アクセストークン更新時の成功レスポンスに refresh_token が含まれていない場合のカスタマイズ。(OAuthRefreshAccessTokenRequestProcessorの実装クラスを作成)
  • 手順5. カスタマイズしたクラスを利用するための OAuthRequestProcessorFactory を作成。
  • 手順6. 動作確認用サンプルの作成

Google側の手順

手順1. OAuth 2.0 クライアント ID の作成

最初に OAuth 2.0 クライアント ID を作成します。

OAuth 2.0を利用したGoogleのAPIアクセス方法に関する詳細は、Using OAuth 2.0 to Access Google APIs を参照してください。

1. Google Developers Consoleにアクセスします。

https://console.developers.google.com/

2. Google Drive API を検索します。


3. APIを有効にするためにプロジェクトを作成します。

4. Google Drive API を有効にします。


5. 認証情報を作成します。

[Go to Credentials]をクリックし、必要な認証情報の種類を指定します。

API を呼び出す場所(=Where will you be calling the API from?)は、
「ウェブサーバ(=Web Server)」を選択します。

アクセスするデータの種類(=What data will you be accessing?) は、
「ユーザデータ(=User data)」を選択します。

6. 必要な認証情報を入力します。

承認済みのリダイレクト URI(=Authorized redirect URIs) に「http://example.org/imart/oauth/redirect」を設定します。
http://example.org/imart 部分は、intra-mart Accel Platform が稼働しているURLを指定してください。

今回は、ローカルマシン上にintra-mart Accel Platform 環境を構築することを前提として、以下を入力してください。
http://localhost:8080/imart/oauth/redirect

7. ユーザに表示するサービス名 を設定します。

今回は、「intra-mart Accel Platform Linkage Sample for Google」と入力します。


8. クライアントID と クライアント シークレット を取得します。

左側のメニュー「認証情報(=Credentials)」より、「intra-mart Accel Platform Linkage Sample」を選択します。

ここに表示された「クライアントID(=Client ID)」と「クライアント シークレット(=Client secret)」を覚えておいてください。
後述の OAuthプロバイダ設定の作成で利用します。


intra-mart Accel Platform側の手順

手順2. OAuthプロバイダ設定の作成。(/conf/oauth-provider-config/*.xmlの作成)

e Builder のモジュールプロジェクト内に「OAuthプロバイダ設定ファイル」を作成します。
OAuthプロバイダ設定ファイルには、外部連携アプリケーションで利用するOAuthプロバイダの情報を設定します。
詳しくは、 設定ファイルリファレンスを参照してください。

src/main/conf/oauth-provider-config/im_cookbook_113639_oauth_client_google.xml

行数|説明|
:--|:--|
18|先ほど取得した「クライアントID」を設定します。|
19|先ほど取得した「クライアント シークレット」を設定します。|
20|スコープを設定します。今回は、Google Drive 上のファイルを参照する為のスコープを設定します。
なお、Googleが公開しているスコープ一覧は、以下を参照してください。
OAuth 2.0 Scopes for Google APIs|

手順3. 認可コード要求時のパラメータをGoogle用にカスタマイズ。(Google用のAuthzCodeRequestクラスの作成)

iAPでは、OAuth2.0の認可コードグラントに対応しています。
OAuth 2.0 における 認可リクエスト のパラメータは以下の通りです。
(詳細は 4.1.1. Authorization Request を参照してください)

  • response_type
  • client_id
  • redirect_uri
  • scope
  • state

認可サーバをGoogleとした場合、上記に加えて以下のパラメータが必要です。

パラメータ名 説明
access_type refresh_token を取得するために「offline」と設定します。
approval_prompt 認証を強制するために「force」と設定します。

パラメータの詳細は、以下を参照してください。

そこで、この2つのパラメータを追加するためのクラスを作成します。

src/main/java/jp/co/intra_mart/cookbook/im_cookbook_113639/oauth/client/service/processor/impl/GoogleAuthzCodeRequest.java

src/main/java/jp/co/intra_mart/cookbook/im_cookbook_113639/oauth/client/service/processor/impl/GoogleConstants.java

手順4. アクセストークン更新時の成功レスポンスに refresh_token が含まれていない場合のカスタマイズ。(OAuthRefreshAccessTokenRequestProcessorの実装クラスを作成)

OAuth 2.0 における 認可リクエスト のパラメータは以下の通りです。
(詳細は 5.1. Successful Response を参照してください)

  • access_token
  • token_type
  • expires_in
  • refresh_token
  • scope

Googleでは、アクセストークン更新時の成功レスポンスに refresh_token が含まれていません。
そこで、以前のリフレッシュトークンを再利用するためのクラスを作成します。

src/main/java/jp/co/intra_mart/cookbook/im_cookbook_113639/oauth/client/service/processor/impl/RefreshAccessTokenRequestProcessorWithoutRefreshTokenOnSuccessResponse.java

手順5. カスタマイズしたクラスを利用するための OAuthRequestProcessorFactory を作成。

src/main/resources/META-INF/services/jp.co.intra_mart.system.oauth.client.service.processor.OAuthRequestProcessorFactory

src/main/java/jp/co/intra_mart/cookbook/im_cookbook_113639/oauth/client/service/processor/impl/GoogleOAuthRequestProcessorFactory.java

src/main/java/jp/co/intra_mart/cookbook/im_cookbook_113639/oauth/client/service/processor/impl/GoogleAuthzCodeRequestProcessor.java

手順6. 動作確認用サンプルの作成

Google Drive 上のファイル一覧を表示するJSPを作成します。

src/main/webapp/im_cookbook_113639_oauth_client_google/google_drive_file_lists.jsp

行数 説明
19 Google Drive の ファイル一覧を取得為のURIを指定します。
Google Drive APIの詳細は、こちら を参照してください。
24〜25 OAuthClientServiceを使う事で、アクセストークンが簡単に取得可能となります。

動作確認

1. intra-mart Accel Platformにログインします。

ここでは、サンプルユーザ「ueda」でログインします。

2. 右上のユーティリティメニューより、[個人設定] - [外部連携アプリケーション]を選択します。

3. 「Google Drive API - im_cookbook_113639」を [許可] します。

4. Google アカウントでログインします。

5. サービスを許可します。


6. サンプル画面「google_drive_file_lists.jsp」にアクセスします。

http://localhost:8080/imart/im_cookbook_113639_oauth_client_google/google_drive_file_lists.jsp にアクセスします。

このGoogleユーザは、Google Drive上のファイルがひとつしか存在しないようです。
試しに、Google Driveにファイルを2つアップロードしてみます。

再度、http://localhost:8080/imart/im_cookbook_113639_oauth_client_google/google_drive_file_lists.jsp にアクセスします。
ファイルの一覧が取得できました。

まとめ

この CookBook では、OAuth2.0 の アクセストークンを Google から取得する方法を紹介しました。

Google以外でも、OAuth 2.0対応の認可サーバであれば、この CookBook と同様の方法でアクセストークンを取得することが可能です。
お客様の用途にあわせて是非ご活用ください。

-CookBook
-

執筆者:


  1. […] は、Box のファイル一覧を取得することを例として、詳細な手順を説明します。 また、Google Drive™ の OAuth2.0 については他にクックブックがあります。詳細はこちらを参照してください。 […]

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

画面に確認ダイアログ(コンファーム)を表示する

画面に確認ダイアログ(imuiConfirm)を表示する方法をご紹介します。 確認ダイアログとは以下の画像のように、ユーザが選択した操作を本当に実行するかどうか確認するための機能です。 確認ダイアログ …

IM-LogicDesignerでBoxにファイルをアップロードし、メタデータや共有リンクを作成する方法

このCookBookでは、IM-LogicDesigner での以下のBox連携LDタスクの使い方について紹介しています。 ユーザ切り替えタスク Boxストレージ取得タスク メタデータ作成タスク 共有 …

no image

Web サーバで Cookie に SameSite=None; Secure 属性を追加する方法

ブラウザの仕様変更により、クロスドメインアクセスにおける Cookie の扱いに変更がありました。 Google Chrome では バージョン 80 以降、SameSite 属性が宣言されていない …

no image

Payara blog のご紹介

この CookBook では Payara のブログについて紹介したいと思います。 以下の URL で Payara に関する様々な記事が投稿されています。 https://blog.payara.f …

no image

IM-BloomMaker 異なるコンテンツ間でアクションをコピーする方法

この CookBook では intra-mart Accel Platform 2021 Winter から利用可能になったアクションの複製機能を使用して、異なるコンテンツ間でアクションをコピーする …