このクックブックでは、OAuth2.0 の アクセストークンを Box から取得する方法を説明します。
intra-mart Accel Platformでは、OAuth2.0 の アクセストークンをユーザ毎に取得・保存する機能が備わっています。主な機能は以下のとおりです。
- 初回のアクセストークン取得に必要な、認可要求に関する一連の画面や処理を共通化して提供
- アクセストークンの有効期限が切れていた場合、リフレッシュトークンを利用して自動的にアクセストークンを更新
これにより、開発者は、OAuth2.0 関連の面倒な実装をすることなく、外部のサービスが提供する様々な Web API へのアクセスを簡単に作成することが可能となります。
今回は、Box のファイル一覧を取得することを例として、詳細な手順を説明します。
また、Google Drive™ の OAuth2.0 については他にクックブックがあります。詳細はこちらを参照してください。
完成サンプル
以下の完成サンプルをダウンロードしてご活用ください。
e builder プロジェクト : im_cookbook_127124.zip
imm ファイル : im_cookbook_127124_oauth_client_box-1.0.0.imm
なお、ベースURLである以下の部分は、環境に合わせて適宜変更してください。
http://localhost:8080/imart
レシピ
概要
Box側の手順
- 手順1. アプリケーション登録 - OAuth 2.0 クライアント ID の作成
intra-mart Accel Platform側の手順
- 手順2. OAuthプロバイダ設定の作成。(/conf/oauth-provider-config/*.xmlの作成)
- 手順3. OAuthRequestProcessorFactory を作成
- 手順4. 動作確認用サンプルの作成
Box側の手順
手順1. OAuth 2.0 クライアント ID の作成
最初に OAuth 2.0 クライアント ID を作成します。
OAuth 2.0を利用したBoxのAPIアクセス方法に関する詳細は、Box Developers | Cloud Content Management APIs を参照してください。
1. CREATE NEW BOX APP にアクセスします。
2. Enterprise Integration を選択します。
3. Standard OAuth 2.0 (User Authentication) を選択します。
4. アプリケーション名を入力します(何でも構いません)。
5. View Your App をクリックします。
6. 「Client ID」と「Client Secret」をメモしておきます。
7. Redirect URI を http://localhost:8080/imart/oauth/redirect に設定します(http://localhost:8080/imart は環境に応じて変更してください)。
intra-mart Accel Platform側の手順
手順2. OAuthプロバイダ設定の作成。(/conf/oauth-provider-config/*.xmlの作成)
e Builder のモジュールプロジェクト内に「OAuthプロバイダ設定ファイル」を作成します。
OAuthプロバイダ設定ファイルには、外部連携アプリケーションで利用するOAuthプロバイダの情報を設定します。
詳しくは、 設定ファイルリファレンスを参照してください。
src/main/conf/oauth-provider-config/im_cookbook_127124_oauth_client_box.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="UTF-8"?> <oauth-provider-config xmlns="http://www.intra-mart.jp/system/oauth/client/config/oauth-provider-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.intra-mart.jp/system/oauth/client/config/oauth-provider-config ../schema/oauth-provider-config.xsd "> <oauth-providers> <oauth-provider id="im_cookbook_127124_oauth_client_box"> <provider-type>box</provider-type> <name message-cd="CAP.Z.IWP.BOX.OAUTH.PROVIDER.NAME">Box API - im_cookbook_127124</name> <description message-cd="CAP.Z.IWP.BOX.OAUTH.PROVIDER.DESCRIPTION">It is allow the use of the Box API.</description> <icon-path></icon-path> <oauth-config> <authz-end-point>https://account.box.com/api/oauth2/authorize</authz-end-point> <token-end-point>https://api.box.com/oauth2/token</token-end-point> <client-id>[Please input your application's Client ID]</client-id> <client-secret>[Please input your application's Client Secret]</client-secret> <scope>root_readwrite</scope> </oauth-config> <extra-config> </extra-config> </oauth-provider> </oauth-providers> </oauth-provider-config> |
行数 | 説明 |
---|---|
18 | 先ほど取得した「クライアントID」を設定します。 |
19 | 先ほど取得した「クライアント シークレット」を設定します。 |
20 | スコープを設定します。今回は、Box 上のファイルを参照する為のスコープを設定します。なお、Box が公開しているスコープ一覧は、以下を参照してください。OAuth 2 Scopes |
手順3. OAuthRequestProcessorFactory を作成。
src/main/java/jp/co/intra_mart/cookbook/im_cookbook_127124/oauth/client/service/processor/impl/BoxConstants.java
1 2 3 4 5 6 7 8 9 10 11 12 |
package jp.co.intra_mart.cookbook.im_cookbook_127124.oauth.client.service.processor.impl; public final class BoxConstants { public static final String PROVIDER_ID = "im_cookbook_127124_oauth_client_box"; //$NON-NLS-1$ public static final String PROVIDER_TYPE = "box"; //$NON-NLS-1$ private BoxConstants() { } } |
src/main/resources/META-INF/services/jp.co.intra_mart.system.oauth.client.service.processor.OAuthRequestProcessorFactory
1 |
jp.co.intra_mart.cookbook.im_cookbook_127124.oauth.client.service.processor.impl.BoxOAuthRequestProcessorFactory |
src/main/java/jp/co/intra_mart/cookbook/im_cookbook_127124/oauth/client/service/processor/impl/BoxOAuthRequestProcessorFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package jp.co.intra_mart.cookbook.im_cookbook_127124.oauth.client.service.processor.impl; import java.util.ServiceLoader; import jp.co.intra_mart.system.oauth.client.service.processor.OAuthAuthzCodeRequestProcessor; import jp.co.intra_mart.system.oauth.client.service.processor.OAuthRefreshAccessTokenRequestProcessor; import jp.co.intra_mart.system.oauth.client.service.processor.impl.StandardAuthzCodeRequestProcessor; import jp.co.intra_mart.system.oauth.client.service.processor.impl.StandardOAuthRequestProcessorFactory; import jp.co.intra_mart.system.oauth.client.service.processor.impl.StandardRefreshAccessTokenRequestProcessor; /** * Box向けのOAuthRequestProcessorFactoryです。<br /> * {@link ServiceLoader}により読みこまれます、以下のファイルに設定が行われています。<br /> * src/main/resources/META-INF/services/jp.co.intra_mart.system.oauth.client.service.processor.OAuthRequestProcessorFactory */ public class BoxOAuthRequestProcessorFactory extends StandardOAuthRequestProcessorFactory { private final OAuthAuthzCodeRequestProcessor authzCodeProcessor; private final OAuthRefreshAccessTokenRequestProcessor refreshTokneProcessor; public BoxOAuthRequestProcessorFactory() { authzCodeProcessor = new StandardAuthzCodeRequestProcessor(BoxConstants.PROVIDER_TYPE); refreshTokneProcessor = new StandardRefreshAccessTokenRequestProcessor(BoxConstants.PROVIDER_TYPE); } @Override public OAuthAuthzCodeRequestProcessor getAuthzCodeRequestProcessor() { return authzCodeProcessor; } @Override public String getProviderType() { return BoxConstants.PROVIDER_TYPE; } @Override public OAuthRefreshAccessTokenRequestProcessor getRefreshAccessTokenRequestProcessor() { return refreshTokneProcessor; } } |
手順6. 動作確認用サンプルの作成
Box 上のファイル一覧を表示するJSPを作成します。
src/main/webapp/im_cookbook_127124_oauth_client_box/box_items.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.util.LinkedHashMap"%> <%@ page import="java.util.Map"%> <%@ page import="jp.co.intra_mart.cookbook.im_cookbook_127124.oauth.client.service.processor.impl.BoxConstants"%> <%@ page import="jp.co.intra_mart.foundation.context.Contexts"%> <%@ page import="jp.co.intra_mart.foundation.context.model.AccountContext"%> <%@ page import="jp.co.intra_mart.foundation.oauth.client.model.AccessTokenInfo"%> <%@ page import="jp.co.intra_mart.foundation.oauth.client.service.OAuthClientService"%> <%@ page import="jp.co.intra_mart.foundation.oauth.client.service.OAuthClientServiceFactory"%> <%@ page import="org.apache.commons.httpclient.Header"%> <%@ page import="org.apache.commons.httpclient.HttpClient"%> <%@ page import="org.apache.commons.httpclient.methods.GetMethod"%> <% final String uri = "https://api.box.com/2.0/folders/0/items"; final String userCd = Contexts.get(AccountContext.class).getUserCd(); final OAuthClientService oAuthClient = OAuthClientServiceFactory.getInstance().getOAuthClientService(BoxConstants.PROVIDER_TYPE); final AccessTokenInfo token = oAuthClient.getAccessToken(userCd, BoxConstants.PROVIDER_ID); int status; Map<String, String> responseHeaders; String responseBodyAsString; final GetMethod httpRequest = new GetMethod(uri); try{ httpRequest.addRequestHeader("Authorization", "Bearer " + token.getAccessToken()); // <-- Set AccessToken status = new HttpClient().executeMethod(httpRequest); responseHeaders = new LinkedHashMap<>(); for (final Header header : httpRequest.getResponseHeaders()) { responseHeaders.put(header.getName(), header.getValue()); } responseBodyAsString = httpRequest.getResponseBodyAsString(); } finally { httpRequest.releaseConnection(); } %> <table border="1"> <tr> <th>status</th> <td><%=status%></td> </tr> <tr> <th>responseHeaders</th> <td><pre><%=responseHeaders%></pre></td> </tr> <tr> <th>responseBodyAsString</th> <td><pre><%=responseBodyAsString%></pre></td> </tr> </table> |
行数 | 説明 |
---|---|
19 | Box の ファイル一覧を取得為のURIを指定します。Box API の詳細は、こちら を参照してください。 |
22〜23 | OAuthClientServiceを使う事で、アクセストークンが簡単に取得可能となります。 |
動作確認
1. intra-mart Accel Platformにログインします。
ここでは、サンプルユーザ「ueda」でログインします。
2. 右上のユーティリティメニューより、[個人設定] - [外部連携アプリケーション]を選択します。
3. 「Box API - im_cookbook_127124」を [許可] します。
4. Box アカウントでログインします。
5. サービスを許可します。
6. サンプル画面「box_items.jsp」にアクセスします。
http://localhost:8080/imart/im_cookbook_127124_oauth_client_box/box_items.jsp にアクセスします。
この Box ユーザは、Box Drive にファイルが存在しないようです。
試しに、Box Drive にファイルを2つアップロードしてみます。
再度、http://localhost:8080/imart/im_cookbook_127124_oauth_client_box/box_items.jsp にアクセスします。
ファイルの一覧が取得できました。
まとめ
この CookBook では、OAuth2.0 の アクセストークンを Box から取得する方法を紹介しました。
Box 以外でも、OAuth 2.0 対応の認可サーバであれば、この CookBook と同様の方法でアクセストークンを取得することが可能です。
お客様の用途にあわせて是非ご活用ください。