Login with minecraft.jp
minecraft.jpのAPIでは認可(Authorization)のためにOAuth 2.0を使用しています。OpenID Connectに対応していますので認証(Authentication)に使用する事も出来ます。
この機能を利用する事でWebサイトや、スマートフォンアプリケーションにminecraft.jpアカウントの認証を組み込む事が出来ます。
いくつかのWebアプリケーション、CMSにはプラグインがありますのですぐに利用可能です。
- WordPress https://wordpress.org/plugins/minecraftjp
- phpBB(3.1以上) https://github.com/MinecraftJP/phpbb-minecraftjp
- Elgg https://github.com/MinecraftJP/elgg-minecraftjp
SDKやライブラリが利用可能な場合は、下記の手順よりも簡単にログイン機能を実装する事が出来ます。
OAuth 2.0の準備
Login with minecraft.jpをあなたのアプリケーションで使用する前にApp ConsoleからOAuth 2.0のアプリ登録を行う必要があります。
OAuth 2.0アプリの登録
- App Consoleを開きます。
- 新規アプリ登録をクリックして、アプリ用のキーを取得します。 アプリケーションタイプはスマートフォンアプリなどはインストールアプリケーション、ブラウザ側で実行されるアプリケーション(JavaScript)などはWebアプリケーション、 Webサーバ側で実行されるアプリケーションなどはサービスアプリケーションを選択してください。
- Redirect URIにはminecraft.jpから認証応答が戻って来ますので、あなたのアプリケーションURIを指定します。
ユーザの認証
認証フロー
- nonceの生成
- 認証リクエストをminecraft.jpに送信
- codeをAccess Token及びID Tokenに交換
- ID Tokenを検証
- ユーザの認証
nonceの作成
認証リクエストにはReply Attack攻撃を防ぐためにnonceを追加する必要があります。nonceは後ほど検証する必要がありますのでセッションなどに保管してください。
PHP
$_SESSION['nonce'] = sha1(openssl_random_pseudo_bytes(24));
認証リクエストをminecraft.jpに送信
認証リクエストURIを作成し、ブラウザにリダイレクトさせます。認証リクエストEnd Point URIはhttps://minecraft.jp/oauth/authorize
です。
リクエストには次のパラメータを指定します。
フィールド名 | 説明 |
---|---|
client_id | App Consoleから取得したClient IDです。 |
response_type | code固定です。 |
scope | 通常のリクエストではopenid profile emailを指定します。 |
redirect_uri | あなたのサーバの認証応答受け取り用エンドポイントです。App Consoleの設定と一致させる必要があります。 |
認証リクエストURIのサンプルはこのようになります。
https://minecraft.jp/oauth/authorize?client_id=d95119dcd37b33ccb7c8&response_type=code&scope=openid%20profile%20email&redirect_uri=https://www.example.net/login/
codeをAccess Token及びID Tokenに交換
認証応答は認証リクエストで指定したredirect_uri
に送信されます。認証応答はURLクエリとして返されます。
Example
https://www.example.net/login/?code=d895ec385449852e6b87a718b8b44e3b73299440
ここで送信されたcode
をToken Endpointに送信し、Access Token及びID Tokenを取得します。Token End Point URIはhttps://minecraft.jp/oauth/token
です。
リクエストには次のパラメータを指定します。
フィールド名 | 説明 |
---|---|
client_id | App Consoleから取得したClient IDです。 |
client_secret | App Consoleから取得したClient Secretです。サービスアカウント指定時のみ追加します。 |
grant_type | authorization_code固定です。 |
code | 認証応答で取得したcode を指定します。 |
redirect_uri | App Consoleで指定したRedirect URIです。 |
リクエストのサンプルはこのようになります。
POST /oauth/token HTTP/1.1
Host: minecraft.jp
Content-Type: application/x-www-form-urlencoded
client_id=d95119dcd37b33ccb7c8&
client_secret={CLIENT_SECRET}&
grant_type=authorization_code&
code=d895ec385449852e6b87a718b8b44e3b73299440&
redirect_uri=https://www.example.net/login/
リクエストが成功するとJSONオブジェクトとして次の応答が返されます。
フィールド名 | 説明 |
---|---|
access_token | minecraft.jp APIへのリクエストに使用するAccess Tokenです。 |
expires_in | アクセストークンの有効期限です。 |
token_type | トークンのタイプです。常にBearer です。 |
scope | アクセストークンでアクセス可能なスコープです。 |
refresh_token | アクセストークンの更新に使用するトークンです。 |
id_token | JWT形式でminecraft.jpによってデジタル署名されたユーザ情報です。 |
ID Tokenを検証
ID Tokenは署名されたJSON ObjectがBASE 64形式でエンコードされています。ID Tokenを認証に利用するにはID Tokenの内容を検証する必要があります。
ID Tokenペイロードサンプル
{
"iss": "minecraft.jp",
"sub": "1",
"aud": "d95119dcd37b33ccb7c8",
"iat": 1403807439,
"exp": 1403811039,
"auth_time": 1403807439,
"nonce": "0b478ee46e666c64886978938c70a75a266427fd"
}
フィールド名 | 説明 |
---|---|
iss | ID Tokenの発行元です。 |
sub | ユニークなminecraft.jp上のIDです。ユーザの識別に利用する事が出来ます。 |
aud | あなたのアプリケーションのClient IDです。 |
iat | ID Tokenが発行された時間のUnix Timestampです。 |
exp | ID Tokenの有効期限のUnix Timestampです。 |
auth_time | 認証が行われた時間のUnix Timestampです。 |
nonce | 最初の認証リクエストで指定したnonceです。 |
ID Tokenの検証にはOpenID Connect Core 1.0 日本語訳などをご覧ください。 Token Info EndpointにID Tokenを送信する事によりminecraft.jp上で検証する事も可能です。
リクエストのサンプルはこのようになります。
GET /oauth/tokeninfo?id_token=eyJ0eXAiOiJKV1QiLCJqa3UiOiJodHRwczpcL1wvbWluZWNyYWZ0LmpwXC9vYXV0aFwvandrcyIsImtpZCI6IjEyNjA0MTc0OTA5MDYyMzQyNTkyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJtaW5lY3JhZnQuanAiLCJzdWIiOiIxIiwiYXVkIjoiZDk1MTE5ZGNkMzdiMzNjY2I3YzgiLCJpYXQiOjE0MDM4MDc0MzksImV4cCI6MTQwMzgxMTAzOSwiYXV0aF90aW1lIjoxNDAzODA3NDM5LCJub25jZSI6IjBiNDc4ZWU0NmU2NjZjNjQ4ODY5Nzg5MzhjNzBhNzVhMjY2NDI3ZmQifQ.wjL_kE4U_YER8Y7DWob4a-oLx6a3jeHH7NL2cei-C2HH39Yt5VzvkBCsVylih06cnR90hb_FIMMtg7Ow28zObXWkLZKQu5UgFmg2y6EU2MU0RGIMckfKOdNpgR6_6vCNA6e9AmAPwYbOxKTRWGpYMEmy5WZ5v858K0hPHhvzXp2YL-kzRWB3c3tXc0UQwFy4K0l_SJjZAHiDc2dsHzgH-eb62oPFTV8SyGDb1LZvb_cQZtVakoDosGJO98lkpDYdCs9TnOcVILgAvIDwV7mKDQqvfr9n-ORNfXNIAdxmTJLhdHR6nHvSWkZbKTLzJNoZlkdd4RT9xt6hWr_GhS_k6A HTTP/1.1
Host: minecraft.jp
リクエストが成功するとID Tokenの検証結果がJSONオブジェクトとして返却されます。
フィールド名 | 説明 |
---|---|
issuer | ID Tokenの発行元です。 |
issued_to | ID Tokenの発行先Client IDです。 |
audience | ID Tokenの発行先Client IDです。 |
user_id | minecraft.jp上のユニークなユーザIDです。 |
expires_in | ID Tokenの有効期限までの時間です。(秒) |
issued_at | ID Tokenの発行された時間のUnix Timestampです。 |
ユーザの認証
ユーザの情報を取得するにはUserInfo Endpointにリクエストを送信します。UserInfo EndpointのURIはhttps://minecraft.jp/oauth/userinfo
です。
リクエストにはAccess Tokenが必要です。
リクエストのサンプルはこのようになります。
GET /oauth/userinfo HTTP/1.1
Host: minecraft.jp
Authorization: Bearer 28c6c045a46465ce6ad6383b53775c25f4ee1800
リクエストが成功するとJSONオブジェクトとして次の応答が返されます。
フィールド名 | 説明 |
---|---|
preferred_username | minecraft.jp上のユーザ名及びMinecraftのアカウント名です。 |
profile | minecraft.jp上のプロフィールURLです。 |
uuid | MinecraftアカウントのUUIDです。 |
minecraft.jp上に登録されているメールアドレスです。 | |
email_verified | メールアドレスが確認済みである事を示します。 |
sub | minecraft.jp上のユニークなIDです。 |