React と Go で Sign In With Google
フロントエンドを React、バックエンドを Go で Sign In With Google (レガシーな Google Sign-In ではなく新しいほう)を実装する。
開発環境
フロントエンド
- node v16.13.1
- npm v8.1.2
- react v17.0.37
- create-react-app でひな形作成。TypeScript 使用。
バックエンド
- go version go1.17.5 linux/amd64
フロントエンド
前提として公式サイトの
を上から見てやっていくとして、困ったことに外部スクリプトを読み込まなくてはいけないといった React としてはつらい仕様となっている。
結果としては身も蓋も無いが下記の記事の内容をほぼそのまま実装した。
TLDR: Scroll down and copy the code. You only need to add your login logic.
と書いていてくれているのでおそらくコピペしても大丈夫だろう。
少なくとも私の環境ではいくらかエラーが出たのと、一旦不要な部分を削って実装したので、修正結果の中身を張っておく。
src/component/page/Login.tsx (ログイン画面のページコンポーネント)
公式サイトに合わせてログインボタンの表示部は id="buttonDiv"
を付与した。
またログインエラー時にエラーメッセージを表示するための領域も確保している。
ロジックはすべて src/hooks/useLogin.ts に切り出した。
|
|
src/hooks/useLogin.ts(ログインロジック)
|
|
react-app-env.d.ts
元記事の筆者ががんばって作ってくれて感謝しかない。
But it should be correct.
とのことだが、一部エラーになったので修正を入れた。
|
|
これで Sign In With Google ボタンを表示し、ログイン後にバックエンドに idToken を投げることができる。
バックエンド
バックエンドで idToken を取り扱いたいのだが、残念ながら公式サイトの
には Go の実装サンプルが無い上、Go のライブラリを見てもどれを使えばいいのかさっぱりわからない。
苦労してググった結果下記のパッケージを使えばいいらしいということがわかった。
ということで早速使うのだが、実はゼロから Sign In With Google のガイドに沿って進めていくとサービスアカウントを作成していないためエラーになる。
エラーメッセージで下記ページを読むように言われると思う。
とりあえず今は自分のローカル環境で実装をしているので「認証情報を手動で追加する」のセクションから読み進め、環境変数に認証情報を指定することとする。
私は Docker Compose で環境を構築しているので docker-compose.yml に environment として追加した。
|
|
.env
に下記のようにバックエンドのコンテナ内におけるサービス アカウント キーの json ファイルのパスを指定しておくと読み込める。
UID=1000
GID=1000
GOOGLE_APPLICATION_CREDENTIALS="/app/configs/dev/xxxx.json"
これで idToken の検証ができるようになった。実装は下記のようになる。
main.go
|
|
参考文献
- 公式サイト
- Sign In With Google JavaScript API reference
- Add the new Google Sign In to your React app!
- google.golang.org/api/idtoken
- サービス アカウントとして認証する
以上