Next.jsを活用したGitHubとGoogleのOAuth認証実装完全ガイド — スムーズなユーザーログインの実現方法
はじめに
これまでの記事でアカウント作成〜ログイン〜ログアウトまでの一連の処理を実装した後に、認証に関して運用上必要となる下記の機能について実装してきました。
- メールアドレス存在有無の確認
- パスワードリセット
- 二要素認証
基本的には登録されたメールアドレスを本人確認するツールとしてトークンを渡しつつ、本人確認ができたのちに上記の処理を実施するという流れでした。実装パターンがある程度決まってはいるものの、それなりのコード量で一つずつ手元で実装された方からすると結構な時間と労力を要したかと思います。
自前で認証に関する機能を実装するとなるとやはりそれなりに時間がかかります。これから新しいサービスを立ち上げるケースなどでは自前で認証機能を実装するにはリソースが足りない場合が多いです。
そういったケースはOauthを活用して認証周りを外部サービスに任せるのが有効になってきます。
今回はGithub、Googleの認証基盤を活用しOauth認証を実装していきます。
※サービスが安定してきたら、メールアドレス/パスワードによる認証を実装しより多くのユーザーを獲得するとより良いかと思います。(ので、これまでご紹介してきた記事も意味がないわけではありませんのでご安心ください)
今回のゴール
Github、Googleの認証基盤を活用しOauth認証でログインできるようにしていきます。
ログイン画面に設置したGithub、GoogleそれぞれのアイコンをクリックするとOAuth同意画面が表示され許可するとログイン済み状態となり設定画面に遷移できるようになります。
GitHubの場合
Googleの場合
OAuth認証について
実装に入る前に簡単にOauth認証についてご紹介しておきたいと思います。
OAuthは、オンラインサービス間で安全に「他のアプリケーションに一部の情報や機能へのアクセスを許可する仕組み」のことです。簡単に言うと、「あなたのアカウント情報を他のアプリに渡さずに、必要な許可だけを与えるための手続き」です。
たとえば、GitHubのアカウントを使って今回作成している認証チュートリアルウェブサービス(以下、認証チュートリアル)にログインしたいときに、OAuthでは、以下のような仕組みでこれを安全に行います。
- GitHubにログイン:認証チュートリアルにGitHubでログインする際、GitHubのログイン画面が表示されます。ここで、GitHubのパスワードを入力しますが、これは認証チュートリアル側では認識しません。
- 許可のリクエスト:認証チュートリアルからGithubでログインする際は、「〇〇の情報にアクセスしてもいいですか?」とGitHubにリクエストを送ります。この許可はあなたが設定する範囲で、例えば「プロフィール情報だけ」とか「リポジトリにアクセス」といった部分的なものです。
- あなたが許可するかどうか決める:GitHubは「このアプリが〇〇にアクセスしようとしていますが、許可しますか?」と確認します。ここで、アクセスしていいかどうかを自分で選択します。
- トークンを発行:もし許可すると、GitHubはそのサービスに「トークン」と呼ばれるキーを発行します。このトークンを使うことで、パスワードを直接渡さずにアクセスができるようになります。
- 認証チュートリアルがトークンを使ってアクセス:認証チュートリアルは、あなたのGitHubアカウントに対して、許可された範囲内で操作を行うことができます。トークンがあれば、パスワードなしで許可された操作ができるということです。
認証チュートリアル側の要件としてはあくまで今アクセスされている人は誰なのか?を特定したいだけなので、GithubでもGoogleでもMetaでもXでもなんでも大丈夫です。今回は実装が簡単なGithubとGoogleを使って実装していきます。
GitHub
OAuthアプリの作成
既にGitHubのアカウントをお持ちの方は下記URLにアクセスしOAuthアプリ作成を進めていきます。
GitHubの任意のページの右上にあるプロフィール写真をクリックし、「設定」をクリックします。
左のサイドバーで「開発者設定」をクリックします。
左のサイドバーで「OAuthアプリ」をクリックします。
初めて訪れる方はまだここに何も作成されていないかと思います。
「New OAuth app」をクリックし作成していきます。
入力が必要な箇所は
- Application name: 検証用とわかりやすくするため「nextjs-14-auth」
- Homepage URL: Next.jsのトップページを指定します。
- Authorization callback URL: GitHubからの認証後にユーザーがリダイレクトされるURLを指定します。
OAuthアプリが作成できると下記のような画面が表示されるかと思います。
環境変数にClient IDとClient secretsを設定します。
GITHUB_CLIENT_ID
: Client ID
GITHUB_CLIENT_SECRET
: Client secrets
GITHUB_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxx
GITHUB_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
続いてAuth.js側でGitHubをプロバイダーとして扱えるよう設定します。
+ import Github from 'next-auth/providers/github'
export default {
providers: [
+ Github({
+ clientId: process.env.GITHUB_CLIENT_ID,
+ clientSecret: process.env.GITHUB_CLIENT_SECRET,
+ }),
このように設定することで、GihHubでのOAuth認証をユーザーが選択した際に今回作成したGitHubのOAuthアプリにリダイレクトされ、認証が通った後にAuth.jsとトークンの受け渡しができるようになります。
トークンの格納
トークンの受け渡しが可能になりましたらDBに格納するためにスキーマの準備を行います。
新しくAccount
というモデルを作成し既に作成済みのUser
と紐づけます。
model User {
id String @id @default(cuid())
- name String
+ name String?
- email String @unique
+ email String? @unique
emailVerified DateTime?
+ image String?
- password String
+ password String?
+ accounts Account[]
}
+ model Account {
+ id String @id @default(cuid())
+ userId String
+ type String
+ provider String
+ providerAccountId String
+ refresh_token String? @db.Text
+ access_token String? @db.Text
+ expires_at Int?
+ token_type String?
+ scope String?
+ id_token String? @db.Text
+ session_state String?
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ @@unique([provider, providerAccountId])
+ }
User
モデルはこれまでメールアドレス/パスワードでの認証を前提としていたため、email
やpassword
、name
などを必須扱いにしていました。
今回、GitHub
によるOAuth認証を導入する場合はこれらの項目に値がセットされなくなるため必須扱いから任意に変更する必要があります。
詳しくはこちらのドキュメントもご参考ください。
スキーマの作成が完了しましたら下記コマンドで型の生成とDBの反映を行います。
npx prisma generate
npx prisma db push
画面の実装
最後にユーザーがGitHubのボタンを押す処理を実装します。
/components/auth/social.tsx
ファイルがそれに該当するのですがこちらは下記の記事でUIだけ作成済みでした。
+ import { signIn } from 'next-auth/react'
import { FaGithub } from 'react-icons/fa'
import { FcGoogle } from 'react-icons/fc'
import { Button } from '@/components/ui/button'
+ import { DEFAULT_LOGIN_REDIRECT } from '@/route'
export const Social = () => {
+ const onClick = (provider: 'google' | 'github') => {
+ signIn(provider, {
+ callbackUrl: DEFAULT_LOGIN_REDIRECT,
+ })
+ }
return (
<div className="flex w-full items-center gap-x-2">
(※一部省略)
<Button
size="lg"
className="w-full"
variant="outline"
+ onClick={() => onClick('github')}
>
<FaGithub className="size-5" />
</Button>
GitHubのアイコンがついているボタンをクリックするとAuth.jsのsignIn
処理が動きます。
GitHub、Googleのどちらかを受け取る前提で、認証が成功しトークンの受け渡しが終わった後にユーザーがアクセスするページをDEFAULT_LOGIN_REDIRECT
としています。
こちらは下記の記事で設定した値となっております。
具体的にはhttp://localhost:3000/settings
を指しており、ログインしたユーザーが一番最初にアクセスする設定ページに遷移するよう設定しましています。
動作確認
ログイン画面からGitHubのアイコンをクリックすると、GitHubのOAuthアプリに遷移します。
「Authorize」(許可する)をクリックすると再びNext.js側に戻り設定画面に遷移します。
npx prisma migrate reset
GitHubでのOAuth認証が成功しましたらGoogleも同じような形で実装を進めていきます。
OAuthアプリの作成
まずはGoogle Cloud Platformで新しいプロジェクトを作成します。
新しいプロジェクトの作成
作成したプロジェクトを選択した後に、「APIs & Services」→「OAuth consent screen」の順にクリック。
OAuth同意画面でUser TypeをExternalに設定。(Next.jsアプリケーションからの接続なのでGoogle Cloudから見ると外部アプリケーションという扱いになります)
App nameとUser support emailの設定を行います。
App nameはGitHubの時と同様「nextjs-14-auth」とします。
ここは特に設定なしで大丈夫です。
Test usersの設定も今回は不要ですので、「SAVE AND CONTINUE」をクリックし作成します。
下記の画面が表示されれば作成完了となります。
同意画面が作成し終わりましたので次はOAuth client IDの発行を行います。
「CREATE CREDENTIALS」 -> 「OAuth client ID」を選択。
下記を登録します。
Authorized JavaScript origins
http://localhost:3000
Authorized redirect URIs
http://localhost:3000/api/auth/callback/google
OAuth client IDの発行が完了しましたらClient IDとClient Secretを確認します。
GitHubの時と同様、環境変数にClient IDとClient secretsを設定します。
GOOGLE_CLIENT_ID
: Client ID
GOOGLE_CLIENT_SECRET
: Client Secret
GOOGLE_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GOOGLE_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
続いてAuth.js側でGitHubをプロバイダーとして扱えるよう設定します。
import Github from 'next-auth/providers/github'
+ import Google from 'next-auth/providers/google'
export default {
providers: [
Github({
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
}),
+ Google({
+ clientId: process.env.GOOGLE_CLIENT_ID,
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET,
+ }),
このように設定することで、GoogleでのOAuth認証をユーザーが選択した際に今回作成したGoogleのOAuthアプリにリダイレクトされ、認証が通った後にAuth.jsとトークンの受け渡しができるようになります。
画面の実装
受け取ったトークンの格納するデータベースの設定はGitHubの設定の中で済ませていたのでGoogle側の設定をする際は不要となります。
残りはユーザーがGoogleアイコンのボタンを押す処理を実装します。
/components/auth/social.tsx
ファイルがそれに該当するのですがこちらは下記の記事でUIだけ作成済みでした。
import { signIn } from 'next-auth/react'
import { FaGithub } from 'react-icons/fa'
import { FcGoogle } from 'react-icons/fc'
import { Button } from '@/components/ui/button'
import { DEFAULT_LOGIN_REDIRECT } from '@/route'
export const Social = () => {
const onClick = (provider: 'google' | 'github') => {
signIn(provider, {
callbackUrl: DEFAULT_LOGIN_REDIRECT,
})
}
return (
<div className="flex w-full items-center gap-x-2">
<Button
size="lg"
className="w-full"
variant="outline"
+ onClick={() => onClick('google')}
>
<FcGoogle className="size-5" />
</Button>
<Button
size="lg"
className="w-full"
variant="outline"
onClick={() => onClick('github')}
>
<FaGithub className="size-5" />
</Button>
</div>
)
動作確認
ログイン画面からGoogleのアイコンをクリックすると、GoogleのOAuthアプリに遷移します。
「nextjs-14-authにログイン」で「次へ」をクリックすると再びNext.js側に戻り設定画面に遷移します。
npx prisma migrate reset
さいごに
Github、Googleの認証基盤を活用しOauthアプリを作成しました。
その後、Next.jsアプリケーションと連携できる設定をしトークンを受け取った後データベースに格納する設定を行いOAuth認証の実装を行いました。
Github、Googleどちらもシンプルな設定で連携可能となっており実際に実装してみると意外と簡単だと思われたかと思います。
ユーザー管理に関わる部分を他サービスに任せることでユーザー管理で必要な様々な機能を実装せずサービスにより重要な機能に注力することが可能となります。
これらのサービスを有効活用し開発スピードの向上につながればと思います。
関連する技術ブログ
Webアクセシビリティの完全ガイド:Lighthouse / axe による自動テスト、WCAG基準策定、キーボード操作・スクリーンリーダー対応まで
Webアクセシビリティの課題を解決するための包括的なガイド。Lighthouse / axe を活用した自動テストの設定、WCAGガイドラインに基づく評価基準の整備、キーボード操作やスクリーンリーダー対応の改善、カラーコントラストの最適化、ARIAランドマークの導入、フォームやモーダルの操作性向上まで詳しく解説。定期的なアクセシビリティレポートを活用し、継続的な改善を実現する方法も紹介します。
shinagawa-web.com
開発業務の自動化紹介:ETL (Python)、Bot (Slack/Discord)、CI/CD (GitHub Actions)、監視 (Sentry/Datadog) まで徹底解説
開発業務の効率化を加速する自動化テクニックを網羅的に解説。データ処理の自動化(ETLスクリプト)、Slack / Discord Bot による定型業務の効率化、Terraform / Pulumi を活用したインフラ管理、CI/CD の最適化、Sentry / Datadog によるエラーハンドリングなど、多方面にわたる自動化の実践例を紹介します。さらに、Pull Request の自動管理、ログ監視、テスト、警告通知の自動化まで、開発のスピードと品質を向上させるためのベストプラクティスを詳しく解説します。
shinagawa-web.com
開発フローを高速化・自動化する CI/CD 戦略:キャッシュ・並列実行・AI レビューの活用
ソフトウェア開発の高速化と安定化を実現するために、CI/CD の最適化は欠かせません。本記事では、npm / yarn / Docker のキャッシュ戦略を強化する方法や、並列実行によるパイプラインの高速化、変更のあった部分のみをテスト・ビルドする仕組みの導入について詳しく解説します。また、Blue-Green デプロイや Canary デプロイを活用した安全な本番環境へのリリース戦略、Terraform / Pulumi によるインフラの自動プロビジョニング、GitHub Secrets / AWS Parameter Store を用いたシークレット管理の最適化についても取り上げます。さらに、エラー発生時の自動ロールバック機能の実装、CI/CD 実行ログの可視化(Datadog / Grafana 連携)、Dependabot / Snyk を活用したセキュリティスキャンの自動化、AI(CodeGPT, DeepCode, Codium など)を用いた PR の自動レビューと改善提案まで、開発フローを効率化するための実践的なアプローチを紹介します。CI/CD の最適化を進め、開発スピードと信頼性を両立させたいエンジニア必見の内容です。
shinagawa-web.com
依存関係のセキュリティ強化:脆弱性スキャン・自動アップデート・OSS ライセンス管理のベストプラクティス
開発プロジェクトにおける依存関係の管理は、セキュリティリスクを最小限に抑えるために不可欠です。本記事では、Snyk / Dependabot を活用した定期的な脆弱性スキャンの導入、npm audit / yarn audit / pnpm audit によるレポート作成と対策、使用中のライブラリのバージョン管理戦略の策定方法について詳しく解説します。さらに、重大な脆弱性を含むパッケージのアラート通知を Slack / Teams へ連携する方法、不要な依存関係の削減による攻撃リスクの低減、OSS ライセンスの適切な管理、新規パッケージ導入時のセキュリティ評価基準の策定についても紹介。
shinagawa-web.com
ESLint / Prettier 導入ガイド: Husky, CI/CD 統合, コード品質の可視化まで徹底解説
開発チームでコードの品質を統一するために、Linter(ESLint)と Formatter(Prettier)は欠かせません。Linter はコードの構文やスタイルの問題を検出し、Formatter はコードの整形を統一します。本記事では、9つの取り組みについて詳しく解説します。
shinagawa-web.com
フロントエンドのテスト自動化戦略:Jest・Playwright・MSW を活用したユニット・E2E・API テスト最適化
フロントエンド開発において、品質を担保しながら効率的に開発を進めるためには、適切なテストの自動化が不可欠です。本記事では、Jest や Vitest を活用したユニットテストの導入・強化、React Testing Library や Storybook との統合によるコンポーネントテストの最適化、Playwright / Cypress を用いた E2E テストの拡充について詳しく解説します。さらに、Supertest や MSW を活用した API テストの自動化、Faker / GraphQL Mock によるモックデータの整理、CI/CD パイプラインにおける並列実行やキャッシュ活用による最適化など、テストを効果的に運用するための手法を紹介。また、Codecov / SonarQube によるテストカバレッジの可視化や、フィーチャーフラグを考慮したテスト戦略の策定についても解説し、実践的なアプローチを提案します。テストの信頼性と効率を向上させ、開発プロセスを強化したいフロントエンドエンジニア必見の内容です。
shinagawa-web.com
GraphQL × TypeScript × Zod:Code Generator を活用した型安全な API 開発とスキーマ管理
GraphQL の開発をより型安全かつ効率的に進めるための実践ガイド。GraphQL Code Generator を活用した TypeScript 型定義の自動生成、Zod を用いたバックエンドのレスポンスバリデーション、スキーマ駆動開発(SDL ベース)のフロー確立、変更履歴の管理、フロントエンドでのフェッチ時の型チェック強化などを解説。さらに、GraphQL Playground / Swagger との API ドキュメント自動生成や Mock サーバーを活用した API テストの自動化についても詳しく紹介します。
shinagawa-web.com
チャットアプリ(画像・PDF送信、ビデオ通話機能付き)
お客様固有の要件を除き一般的なチャットアプリに求められる最低限の機能を実装しデモアプリとしてご紹介いたします。
shinagawa-web.com
弊社の技術支援サービス
無駄なコストを削減し、投資対効果を最大化する
クラウド費用の高騰、不要なSaaSの乱立、開発工数の増加――これらの課題に悩んでいませんか?本サービスでは、クラウドコストの最適化、開発効率向上、技術選定の最適化 を通じて、単なるコスト削減ではなく、ROIを最大化する最適解 をご提案します。
shinagawa-web.com
最新技術の導入・検証を支援するPoCサービス
Remix、React Server Components、TypeScript移行、クラウドサービス比較、マイクロサービス、サーバーレス、デザインシステムなど、最新技術のPoC(概念実証)を通じて、最適な技術選定と導入を支援します。貴社の開発課題に合わせた検証・実装で、ビジネスの成長を加速させます。
shinagawa-web.com
開発生産性を最大化するための支援サービス
開発チームの生産性向上、コードの品質管理、インフラの最適化まで、様々な側面からサポートします。コードベースのリファクタリングから、テスト自動化、オンボーディング強化まで、プロジェクトの成功に必要なすべての支援を提供。御社の開発現場が効率的に機能するように、技術的な障害を取り除き、スムーズな開発を実現します。
shinagawa-web.com
開発品質向上支援 – 効率的で安定したプロダクトを実現
フロントエンドからバックエンド、データベースまで、開発プロセス全体を最適化し、安定したプロダクト作りをサポートします。コードレビューの仕組み、型定義の強化、E2Eテスト環境の構築など、開発の各ステップにおけるベストプラクティスを導入することで、より効率的でバグの少ない、そしてユーザー満足度の高いサービス提供を支援します。
shinagawa-web.com
Webアプリのセキュリティ強化支援
Webアプリの脆弱性対策からインフラのセキュリティ強化まで、包括的なセキュリティ支援を提供。OWASP Top 10対策、JWT認証の最適化、APIのアクセス制御、依存パッケージの監査、セキュアコーディングの標準化など、実践的なアプローチで開発現場の安全性を向上させます。
shinagawa-web.com
目次
お問い合わせ