日本時間5月16日のContent Cloud Summitで、カスタムアプリにBox AI APIを活用する方法を紹介します。

詳細を表示

SDKを使用しないOAuth 2.0

ガイド 認証 OAuth 2.0認証 SDKを使用しないOAuth 2.0

SDKを使用しないOAuth 2.0

概要

Box公式SDKを利用すると、一般的な認証のハードルはなくなりますが、Box APIは、Box公式SDKがなくても使用できます。このガイドでは、OAuth 2.0のフローを手動で完成させるための手順を説明します。

  1. 承認URLを作成する
  2. ユーザーを承認URLにリダイレクトする
  3. ユーザーが自分の代わりにアクションを実行するためのアクセス権限をアプリケーションに付与する (成功した場合は承認コードが提供される)
  4. ユーザーを再度アプリケーションにリダイレクトする
  5. 承認コードをアクセストークンと交換する

このフローが終了すると、アプリケーションにはアクセストークンが付与されます。これを使用すると、ユーザーの代わりにAPIコールを実行できます。

OAuth 2.0フローを介して取得したアクセストークンは、もともとアプリケーションを承認したユーザーに関連付けられています。

as-userヘッダーを使用して、別のユーザーとして処理を実行できます。

前提条件

続行する前に、以下の手順を完了しておく必要があります。

  • Box開発者コンソールで、OAuth 2.0認証方法を利用するカスタムアプリを作成する。
  • アプリケーションの [構成] タブに移動して、client_idclient_secretの値をコピーする。
  • アプリケーションの [構成] タブで、少なくとも1つのリダイレクトURIが構成されていることを確認する。

1. 承認URLを作成する

承認URLは、以下のパラメータで構成されています。

パラメータステータス説明
CLIENT_ID必須開発者コンソールの [構成] タブから取得します。
REDIRECT_URI省略可開発者コンソールで構成します。アプリケーションにアクセスを許可すると、ユーザーがリダイレクトされます。
RESPONSE_TYPE必須常にcodeに設定します。
STATE推奨クロスサイトリクエスト偽造から保護します。

アプリケーション用にリダイレクトURIを複数設定した場合、承認URLには、開発者コンソールで設定したURIのいずれかと一致するredirect_uriパラメータを含める必要があります。このパラメータが指定されていない場合、ユーザーにはredirect_uri_missingエラーが表示され、アプリにリダイレクトされません。

少なくとも、このURLは常に次の形式を使用します。

https://account.box.com/api/oauth2/authorize?client_id=CLIENTIDHERE&response_type=code

.Net
var baseUrl = "https://account.box.com/api/oauth2/authorize";
var clientId = "[CLIENT_ID]";
var authorizationUrl = $"{baseUrl}?client_id={clientId}&response_type=code";

Java
String baseUrl = "https://account.box.com/api/oauth2/authorize";
String clientId = "[CLIENT_ID]";
String authorizationUrl = String.format("%s?client_id=%s&response_type=code", baseUrl, clientId);

Python
base_url = 'https://account.box.com/api/oauth2/authorize'
client_id = '[CLIENT_ID]'
authorizationUrl = f'{base_url}?client_id=${client_id}&response_type=code'

Node
var baseUrl = "https://account.box.com/api/oauth2/authorize";
var clientId = "[CLIENT_ID]";
var authorizationUrl = `${baseUrl}?client_id=${clientId}&response_type=code`;

承認URLの詳細を確認する

BoxインスタンスのBox Verified Enterpriseが有効になっている場合、標準的なaccount.box.comというベースURLを使用する際に問題が発生することがあります。account.box.comの代わりにent.box.comを使用してください。

2. ユーザーをリダイレクトする

次に、ユーザーを承認URLにリダイレクトします。その方法は、アプリケーションフレームワークによって異なります。このトピックの詳細については、ほとんどのフレームワークのドキュメントで説明されています。

指定されたアプリに対して承認URLが無効な場合、ユーザーには、アクセスの許可画面ではなくエラーページが表示されます。たとえば、承認URLに含まれるredirect_uriパラメータが、アプリ用に構成されたURIのいずれとも一致しない場合、ユーザーにはredirect_uri_mismatchエラーが表示されます。

.NET
var authorizationUrl = $"{baseUrl}?client_id={clientId}&response_type=code";
// redirectTo(authorizationUrl);

Java
String authorizationUrl = String.format("%s?client_id=%s&response_type=code", baseUrl, clientId);

// response.redirect(authorizationUrl);

Python
auth_url = f'{base_url}?client_id=${client_id}&response_type=code'
// redirect(auth_url, code=302)

Node
var authorizationUrl = `${baseUrl}?client_id=${clientId}&response_type=code`;
// res.redirect(authorize_url)

スコープを制限したり追加の状態を渡したりするために、ユーザーをリダイレクトする際に追加のクエリパラメータを渡すことができます。詳細については、承認のリファレンスドキュメントを参照してください。

3. ユーザーがアプリケーションにアクセス権限を付与する

ユーザーは、Box UIを使用して自分のアカウントにログインするために、ブラウザにリダイレクトされます。その後、リクエストされているスコープのリストと、ユーザーに代わって処理を行うアプリケーションを承認するためのオプションが表示されます。

OAuth 2.0承認画面の例

ユーザーが [Boxへのアクセスを許可] をクリックしてこのリクエストを承認すると、ブラウザは、クエリパラメータに有効期間の短い承認コードが指定されている構成済みのリダイレクトURLにリダイレクトされます。

アプリケーション用にリダイレクトURIを複数設定した場合、承認URLには、開発者コンソールで設定したURIのいずれかと一致するredirect_uriパラメータを含める必要があります。このパラメータが指定されていない場合、ユーザーにはredirect_uri_missingエラーが表示され、アプリにリダイレクトされません。

https://your.domain.com/path?code=1234567

4. コードを交換する

提供される承認コードは、有効期間が30秒のため、有効期限が切れる前にアクセストークンに交換する必要があります。

.NET
using System.Net;
using System.Net.Http;
using Newtonsoft.Json;

String authenticationUrl = "https://api.box.com/oauth2/token";
var client = new HttpClient();

var content = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("grant_type", "authorization_code"),
    new KeyValuePair<string, string>("code", "[CODE]"),
    new KeyValuePair<string, string>("client_id", "[CLIENT_ID]"),
    new KeyValuePair<string, string>("client_secret", "[CLIENT_SECRET]")
});

var response = client.PostAsync(authenticationUrl, content).Result;

class Token
{
    public string access_token { get; set; }
}

var data = response.Content.ReadAsStringAsync().Result;
var token = JsonConvert.DeserializeObject<Token>(data);
var accessToken = token.access_token;

Java
String authenticationUrl = "https://api.box.com/oauth2/token";

List<NameValuePair> params = new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("grant_type", "authorization_code"));
params.add(new BasicNameValuePair("code", "[CODE]"));
params.add(new BasicNameValuePair("client_id", "[CLIENT_ID]"));
params.add(new BasicNameValuePair("client_secret", "[CLIENT_SECRET]"));

CloseableHttpClient httpClient = HttpClientBuilder.create().disableCookieManagement().build();

HttpPost request = new HttpPost(authenticationUrl);
request.setEntity(new UrlEncodedFormEntity(params));

CloseableHttpResponse httpResponse = httpClient.execute(request);
HttpEntity entity = httpResponse.getEntity();

String response = EntityUtils.toString(entity);
httpClient.close();

class Token {
    String access_token;
}

Token token = (Token) gson.fromJson(response, Token.class);
String accessToken = token.access_token;

Python
authentication_url = "https://api.box.com/oauth2/token";

params = urlencode({
    'grant_type': 'authorization_code',
    'code': '[CODE]',
    'client_id': '[CLIENT_ID]',
    'client_secret': '[CLIENT_SECRET]'
}).encode()

request = Request(authentication_url, params)
response = urlopen(request).read()
access_token = json.loads(response)['access_token']

Node
const authenticationUrl = "https://api.box.com/oauth2/token";

let accessToken = await axios
    .post(
        authenticationUrl,
        querystring.stringify({
            grant_type: "authorization_code",
            code: "[CODE]",
            client_id: "[CLIENT_ID]",
            client_secret: "[CLIENT_SECRET]",
        })
    )
    .then((response) => response.data.access_token);

アクセストークンの使用方法を確認するには、APIコールの実行に関するガイドを参照してください。