Go Langで新規登録のWebAPIを作成したので、認証周りをJWTで作成する。
期待するもの
新規登録のAPIを作成したので、次はログイン機能を作成したい。
ログインは、メールアドレスとパスワードを送り一致したら、tokenを取得する。
で、tokenを使って認証付きのAPIを叩けるようになりたい。
tokenにはjwtを使用する。
jwtってなに?
これはどこかで調べてまとめる(気が向いた時)。
JWT認証を作成する
パッケージのインストール
github.com/dgrijalva/jwt-goパッケージの情報が多かったので、それに従うことにする。長い物には巻かれるべきで間違いない。
パッケージをインストールする。
Tokenを生成する
まずjwt.goというファイルを作成する。
今回はauthフォルダの中に作成した。
それでは書いていく。
まずは、jwtを生成するためのシークレットキーを作成する。
ここでは任意の文字列(今回は"your_secret_key")をバイト列に変換し、jwtKeyに代入している。
バイト列というのがピンとこないので、
fmt.Printlnで書き出しみると、[121 111 117 114 95 115 101 99 114 101 116 95 107 101 121]となった。なんとなく理解した。
このようにして文字列をバイト列に変換することは、多くの場面でデータの操作や処理に利用されます。JWTの署名などのセキュリティ関連の操作では、シークレットキーをバイト列として扱うことが一般的です。
とのことでした。
次に、JWTのクレームを表す構造体であるClaimsを定義する。
これは任意のJSONデータっていう意味っぽい。
今回はnameを含めることにする。
と思ったけど、ユニークで必要がありそうなので、ユーザーIDにした。
下記のように変更する。
次に、Tokenを作成する関数を作成する。
コードの詳細はコメントアウトに書いた。
これでTokenを作成することができた。
ログイン時にこのTokenを返却することにする。
Tokenを認証する
次に認証を行う関数を作成する。
ちなみにこの関数の関数名が大文字始まりなのは下記の通り。
Go言語では、関数や変数が大文字で始まる場合には他のパッケージから参照可能(エクスポート可能)となりますが、小文字で始まる場合には同じパッケージ内からのみアクセス可能となります。
で、このコントローラーを下記のように噛ませる。
これで認証が必要になった。
実際に叩くときは
こんな感じでヘッダーを持たせる必要がある。
これでJWT認証ができるようになった。
Discussion in the ATmosphere