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

IM-BloomMaker 変数の入力規則、どう使い分ければいいの?

Accel Platform 2023 Autumnで、文字列型変数の入力規則に「最大の文字数」「最小の文字数」が追加されました。 一見似ている「長さ」「文字数」「バイト数」という入力規則をどうやって …

no image

IM-Notice Broker の設定方法

この CookBook では、分散環境での IM-Notice (デスクトップ版)の設定方法について紹介しています。 分散環境の構成として、以下のような 2 台構を考えます。 マシン IPアドレス A …

no image

IMBox に投稿種別を追加する方法(textile)

このCookBookでは、IMBoxに投稿種別を追加する方法について紹介しています。 以下のドキュメントを参照することで、IMBox に投稿種別を追加することができます。 IMBox プログラミングガ …

no image

テナント環境セットアップ時にテーブルが作成されるよう設定する

e Builderを利用して作成したアプリケーションにおいて、テナント環境セットアップ時に自動でテーブルが作成されるように設定する手順を紹介します。 今回は例として、CookBook:フォームに入力し …

no image

設計書出力に任意のシートを追加する方法

このCookBookでは、BIS設計書出力機能で出力できるIM-Workflowフロー設計書およびBISフロー設計書に任意のシートを出力する方法について紹介しています。 完成イメージ 1. IM-BI …