🔑

Golangでパスキーのバックエンドをやるためのライブラリを作った

に公開

https://github.com/aethiopicuschan/passkey-go

パスキー、流行ってますよね。私は普段Golangを使うことが多いのですが、パスキーをやるためのライブラリでこれといったものが無かったので自作しました。READMEやexampleを見てもらえればわかると思いますが、以下の3つのAPIを用意すればすぐに使えるような形になっています。

  • GetChallenge
  • Register
  • Login

フロントでは navigator.credentials.createnavigator.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