SDKを使用しないOAuth 2.0
SDKを使用しないOAuth 2.0
概要
Box公式SDKを利用すると、一般的な認証のハードルはなくなりますが、Box APIは、Box公式SDKがなくても使用できます。このガイドでは、OAuth 2.0のフローを手動で完成させるための手順を説明します。
- 承認URLを作成する
- ユーザーを承認URLにリダイレクトする
- ユーザーが自分の代わりにアクションを実行するためのアクセス権限をアプリケーションに付与する (成功した場合は承認コードが提供される)
- ユーザーを再度アプリケーションにリダイレクトする
- 承認コードをアクセストークンと交換する
このフローが終了すると、アプリケーションにはアクセストークンが付与されます。これを使用すると、ユーザーの代わりにAPIコールを実行できます。
前提条件
続行する前に、以下の手順を完了しておく必要があります。
- Box開発者コンソールで、OAuth 2.0認証方法を利用するカスタムアプリを作成する。
- アプリケーションの [構成] タブに移動して、
client_id
とclient_secret
の値をコピーする。 - アプリケーションの [構成] タブで、少なくとも1つのリダイレクトURIが構成されていることを確認する。
1. 承認URLを作成する
承認URLは、以下のパラメータで構成されています。
パラメータ | ステータス | 説明 |
---|---|---|
CLIENT_ID | 必須 | 開発者コンソールの [構成] タブから取得します。 |
REDIRECT_URI | 省略可 | 開発者コンソールで構成します。アプリケーションにアクセスを許可すると、ユーザーがリダイレクトされます。 |
RESPONSE_TYPE | 必須 | 常にcode に設定します。 |
STATE | 推奨 | クロスサイト リクエスト偽造から保護します。 |
少なくとも、このURLは常に次の形式を使用します。
https://account.box.com/api/oauth2/authorize
?client_id=CLIENTIDHERE
&response_type=code
var baseUrl = "https://account.box.com/api/oauth2/authorize";
var clientId = "[CLIENT_ID]";
var authorizationUrl = $"{baseUrl}?client_id={clientId}&response_type=code";
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);
base_url = 'https://account.box.com/api/oauth2/authorize'
client_id = '[CLIENT_ID]'
authorizationUrl = f'{base_url}?client_id=${client_id}&response_type=code'
var baseUrl = "https://account.box.com/api/oauth2/authorize";
var clientId = "[CLIENT_ID]";
var authorizationUrl = `${baseUrl}?client_id=${clientId}&response_type=code`;
承認URLの詳細を確認する
2. ユーザーをリダイレクトする
次に、ユーザーを承認URLにリダイレクトします。その方法は、アプリケーションフレームワークによって異なります。このトピックの詳細については、ほとんどのフレームワークのドキュメントで説明されています。
指定されたアプリに対して承認URLが無効な場合、ユーザーには、アクセスの許可画面ではなくエラーページが表示されます。たとえば、承認URLに含まれるredirect_uri
パラメータが、アプリ用に構成されたURIのいずれとも一致しない場合、ユーザーにはredirect_uri_mismatch
エラーが表示されます。
var authorizationUrl = $"{baseUrl}?client_id={clientId}&response_type=code";
// redirectTo(authorizationUrl);
String authorizationUrl = String.format("%s?client_id=%s&response_type=code", baseUrl, clientId);
// response.redirect(authorizationUrl);
auth_url = f'{base_url}?client_id=${client_id}&response_type=code'
// redirect(auth_url, code=302)
var authorizationUrl = `${baseUrl}?client_id=${clientId}&response_type=code`;
// res.redirect(authorize_url)
3. ユーザーがアプリケーションにアクセス権限を付与する
ユーザーは、Box UIを使用して自分のアカウントにログインするために、ブラウザにリダイレクトされます。その後、リクエストされているスコープのリストと、ユーザーに代わって処理を行うアプリケーションを承認するためのオプションが表示されます。
ユーザーが [Boxへのアクセスを許可] をクリックしてこのリクエストを承認すると、ブラウザは、クエリパラメータに有効期間の短い承認コードが指定されている構成済みのリダイレクトURLにリダイレクトされます。
https://your.domain.com/path?code=1234567
4. コードを交換する
提供される承認コードは、有効期間が30秒のため、有効期限が切れる前にアクセストークンに交換する必要があります。
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;
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;
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']
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コールの実行に関するガイドを参照してください。