Laravel における Bearer 認証

一般的に REST API の認証で用いられる Bearer 認証の実装方法について紹介していきます。

Bearer 認証とはなにか

REST API における認証の方式として、トークンを用いた認証が一般的に用いられています。

トークンの受け渡し方法としては RequestBody に含めるケースもやや見られますが、一般的にはHeaderに付与する方式が取られるでしょう。

このトークンを Header に付与するケースに置いて、Header名として X-AUTHTOKEN などの任意のカスタムHeader(カスタムのHTTP Headerは X- を付与します) を用いることもできますが、広く認証用のHeader として用いられている Authorization ヘッダを利用するほうが、仕様的な収まりがついて良いでしょう。

Authorization ヘッダ

Authorization ヘッダは以下の形式で送信される認証に関する情報を送出するフィールドです。
Basic 認証などでも用いられるこのヘッダは、RFCでの仕様定義が行われており、広くオープンな仕様として用いることができます。

Authorization ヘッダの形式は、以下の形式で定められており、この形式に沿って実装を行う必要があります。

Authorization: auth-scheme credential

auth-scheme として利用可能なキーワードは、別途IANAで管理されており、 Bearer はその中の一つとなります。

Bearer認証は別名持参人認証とも呼ばれ、トークン等の識別情報を持ってきた人を本人として認証する認証方式の一つです。 Bearer 認証を利用する場合、ヘッダの形式は以下のような形になります。

Authorization: Bearer token68

token68 は 半角英数に -, ., _, ~, +, / の記号を加えた68通りの文字種から構成される任意のトークン文字列です。68種類の文字に加えて、末尾に任意長の = の連続も許容されるため、 base64 文字列も token68 文字列として使用することが可能です。

Authorization ヘッダの使用に関する詳しい情報は以下の記事が参考になります。

トークンを利用した認証・認可 API を実装するとき Authorization: Bearer ヘッダを使っていいのか調べた

Laravel における Bearer 認証

Laravel で Bearer 認証のトークン (Bearer トークン) を読み出す場合、 Request::bearerToken() が利用可能です。

use Illuminate\Http\Request;

class UserController {
  public function user(Request $request){
    $token = $request->bearerToken();
    ....
  }
}

Request::bearerToken() は、上記の Bearer 認証のフォーマットに沿った形で送信されたトークンを自動的にパースして取得してくれます(Bearer 文字列は含まずトークンのみを)。

API認証で Bearer 認証を利用する

Request Guard を用いて APIにおける認証を設定する場合、 ServiceProvider 等で以下のように設定して、API 認証の実装を行うことができます。

app('auth')->viaRequest('apiauth', function ($request) {
    if ($token = $request->bearerToken()) {
        return User::findByToken($token);
    }
});

Guard周りの設定にもよりますが、上記の RequestGuard の設定を行うことで、Controller 等から Auth::user() の形で、トークンと紐づくユーザの取得が可能になりますので、
あとは、デフォルトの auth ミドルウェア等を用いて、認証が必要なルート等の制御も行えるようになるはずです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です