watermint.org - Takayuki Okazaki's note

Dropbox API: 認証・認可について

今回はDropbox APIの認証・認可についてかいつまんでご紹介します。Dropbox APIの認証・認可はOAuth2を利用しています。公式SDKの実装サンプルなどを参考にJavaとGoでの実装例をもとに紹介していきます。

Dropbox APIの概要でもご紹介したとおり、実装前にはアプリケーションの登録が登録が必要です。登録がすんだらApp keyとApp Secretが得られますのでこれらを使いましょう。

Java

SDKにauthorizeというサンプルがありますのでこれを参考にすると良いでしょう。 一般的なOAuthの流れと比べて変わったところは特にありません。Dropbox SDK JavaのJavadocに簡単な流れがのっているのでこちらを引用してご紹介します。

// No Redirect Example
DbxRequestConfig requestConfig = new DbxRequestConfig("text-edit/0.1");
DbxAppInfo appInfo = DbxAppInfo.Reader.readFromFile("api.app");
DbxWebAuth auth = new DbxWebAuth(requestConfig, appInfo);
DbxWebAuth.Request authRequest = DbxWebAuth.newRequestBuilder()
    .withNoRedirect()
    .build();
String authorizeUrl = auth.authorize(authRequest);
System.out.println("1. Go to " + authorizeUrl);
System.out.println("2. Click \"Allow\" (you might have to log in first).");
System.out.println("3. Copy the authorization code.");
System.out.print("Enter the authorization code here: ");
String code = System.console().readLine();
if (code != null) {
    code = code.trim();
    DbxAuthFinish authFinish = webAuth.finishFromCode(code);
    DbxClientV2 client = new DbxClientV2(requestConfig, authFinish.getAccessToken());
    // APIを使った処理
}

この例ではApp Key・App Secretをファイルから読み込んでいます。api.appという名前で次のようなJSON形式ファイルを準備しておいてください。

{
  "key"    : "App keyと置き換え",
  "secret" : "App secretと置き換え"
}

大まかな流れとしては次の通りです。

  1. 設定情報などを準備 (DbxRequestConfig, DbxAppInfo)
  2. リクエストを準備
  3. 認証URLを生成し、ユーザーに認可をもとめる
  4. コードを受け取りトークンを生成
  5. DbxClientV2インスタンスを作成して各種APIコール

設定できるオプションとしては、DbxRequestConfigにはエラー時の再試行回数などがあります。

Go

個人的にGoで実装する際には非公式SDKのdropbox-sdk-go-unofficialを使っています。処理の流れは基本的にJavaでの実装と同じです。OAuth認証・認可処理自体はSDKとは関係なくgolang.org/x/oauth2を利用しています。

authCfg := &oauth2.Config{
	ClientID:     "App keyと置き換え",
	ClientSecret: "App Secretと置き換え",
	Scopes:       []string{},
	Endpoint: oauth2.Endpoint{
		AuthURL:  "https://www.dropbox.com/oauth2/authorize",
		TokenURL: "https://api.dropboxapi.com/oauth2/token",
	},
}
authorizeUrl := authCfg.AuthCodeURL(
	"csrf-stateの文字列",
	oauth2.SetAuthURLParam("response_type", "code"),
)
fmt.Println("1. Go to " + authorizeUrl);
fmt.Println("2. Click \"Allow\" (you might have to log in first).");
fmt.Println("3. Copy the authorization code.");
fmt.Print("Enter the authorization code here: ");
var code string
fmt.Scan(&code)
token, err := authCfg.Exchange(context.Background(), code)
if err == nil {
	dropboxCfg := dropbox.Config{
		Token: token.AccessToken,
	}
	client := files.New(dropboxCfg)
	// ...
}

認証時のロール

ちょっと変わったところとしてはリクエストを準備する際のロールについて紹介しておこうと思います。OAuthではscopesというパラメータを使ってアプリケーションに対し、認可する範囲を設定します。DropboxではDropbox APIの概要にてご紹介したとおり、アプリケーション登録時にアクセス権限を設定します。

このため、scopesパラメータを使わない場合も多いのですが一つだけ指定できるものがあります。

Dropboxでは個人向けDropbox (Dropbox Basic、Plus、Professional)アカウントと、Dropbox Businessアカウントをリンクすることでパソコン、スマートフォン、タブレットなどのアプリケーションで同時に二つのアカウントを利用できる機能があります。

このときに、アプリケーションの接続を会社のアカウントのみに限定したいとか、逆に個人向けのみに限定したいといった指定にscopesパラメータを利用します。

Javaの場合はDbxWebAuth.Request.BuilderwithRequireRole()メソッドへROLE_PERSONALまたはROLE_WORKを指定します。

トークンの無効化

一定の処理が終わって、ログアウトに相当するトークンの無効化処理をしたい場合の処理です。これは、User EndpointsとBusiness Endpointsで若干変わります。

User Endpointsの場合

User Endpointsの場合はauth/token/revokeにAccess Tokenを渡すだけです。

Business Endpointsの場合

Business Endpointsではauth/token/revokeに直接相当するAPIがありません。このためチーム管理者が管理者コンソールよりチーム向けアプリケーションを無効化する必要があります