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 については他にクックブックがあります。詳細はこちらを参照してください。 […]

OAuth2.0 の アクセストークンを Box から取得する方法 – intra-mart Developer Site にコメントする コメントをキャンセル

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

関連記事

no image

承認ノードの画面アイテムに任意の初期値を設定する方法

このCookBookでは、BISワークフローにおいて、承認ノードの画面アイテムに任意の初期値を設定する方法を紹介します。 画面アイテムに任意の初期値を設定する方法としては、画面アイテムプロパティである …

no image

intra-martを初めて使う開発者が、まずは e Builder で「Hello world!」する方法

e Builder は、intra-mart Accel Platform で動作するアプリケーションを開発するための開発支援ツールです。 このレッスンでは、intra-martを初めて使う開発者が …

案件一覧「My検索条件」の活用例

このCookbookでは、intra-mart Accel Platform 2019 Springから利用可能な、案件一覧画面にある「My検索条件」機能を活用し、任意の条件別にブックマークを作成する …

no image

フォーム内の入力値を案件名に自動入力する方法

このCookbookでは、IM-FormaDesignerで作成した申請画面から入力内容を案件名に設定する方法を紹介します。 この方法を利用するとIM-FormaDesignerの入力内容をIM-Wo …

no image

スクリプト開発モデルで作成した1つのページソースを複数の画面で利用する

このCookBookでは、任意のスクリプト開発モデルプログラムをコールして部分ページソース挿入を行う方法を紹介します。 部分ページソース挿入は<imart type=”include”>タ …

まだデータがありません。

RSSRSSRSSRSS