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

Formaのスクリプトから処理対象者を制御するには

このCookBookでは、スクリプトを利用してIM-Workflowの動的ノード(動的承認、縦配置、横配置)の処理対象者を制御する方法をご紹介します。 スクリプトから動的処理対象者設定機能を利用するこ …

no image

スクリプト開発した画面にバリデーション(入力チェック)を実装する

このCookBookでは、作成した画面項目に対してバリデーション(入力チェック)を設定する方法をご紹介します。 今回はスクリプト開発で登録フォームを作成するで作成した画面項目に対して、クライアントサイ …

IM-BloomMaker グラフエレメントの使い方(基本編)

このCookBookでは、intra-mart Accel Platform 2019 Winter から利用可能になった IM-BloomMaker のグラフエレメントの使い方について紹介しています …

標準の画面アイテムを利用して「先頭へ戻る」ボタンを実現する

このCookBookでは、標準の画面アイテムを利用して「先頭へ戻る」ボタンを実現する方法について紹介しています。 本稿では、表示する項目が多く縦長い画面で下へスクロールすると右下に「先頭へ戻る」ボタン …

no image

バージョンアップを認めずパッチのみを許可する module.xml の依存関係の指定方法の書き方

この CookBook では、module.xml の依存関係の書き方について紹介しています。 記事のタイトルにあるように、モジュールを特定のバージョンのパッチまでに依存する方法についてご紹介します。 …