🔑
Golangでパスキーのバックエンドをやるためのライブラリを作った
パスキー、流行ってますよね。私は普段Golangを使うことが多いのですが、パスキーをやるためのライブラリでこれといったものが無かったので自作しました。READMEやexampleを見てもらえればわかると思いますが、以下の3つのAPIを用意すればすぐに使えるような形になっています。
- GetChallenge
- Register
- Login
フロントでは navigator.credentials.create
や navigator.credentials.get
などを使ってAPIを叩くだけで済みます。より詳細を知りたい場合はexampleをご覧ください。動く形でバックエンドとフロントエンドのサンプルを置いてあります。
エラーハンドリング
起こりうるエラーを以下の形で予め定義しています。
type PasskeyError struct {
Code string // e.g. "E1001"
Message string // human-readable message
HTTPStatus int // HTTP status code to return
Field string // optional: field name for validation errors
}
これによって、エラー時のハンドリングを簡単に行えます。
if err := someFn(); err != nil {
var perr *passkey.PasskeyError
if errors.As(err, &perr) {
http.Error(w, perr.Message, perr.HTTPStatus)
return
}
http.Error(w, "internal server error", 500)
}
注意点
このライブラリは諸々の情報の永続化のような機能を持っていません。クレデンシャルやチャレンジなどはユーザが管理する必要があります。これは多様なシステムに組み込めるようにするため意図的に無視しているものになります。
テスト
セキュリティ的に重要な処理を提供するライブラリですので、かなり丁寧にテストを書きました。今のところ、カバレッジは82.8%です。また、テストコードを見ることによっても使い方がわかるように意識しました。
おわりに
以上です。Golangをバックエンドに採用していてパスキーをやりたいという方がいらっしゃいましたら是非採用をご検討ください。
Discussion