1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Twitter clone Part8 next authとfirebaseを使ってログインページの実装

Posted at

概要

今回はfirebaseとnext authを使ってログイン機能を実装します。
以下実装後の様子です。

loginPage.gif

開発環境

OS:Windows10
IDE:VSCode

package.json
{
  "name": "",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "@heroicons/react": "^1.0.6",
    "next": "12.0.9",
    "react": "17.0.2",
    "react-dom": "17.0.2"
  },
  "devDependencies": {
    "@types/node": "^20.4.2",
    "@types/react": "^18.2.15",
    "autoprefixer": "^10.4.2",
    "eslint": "8.8.0",
    "eslint-config-next": "12.0.9",
    "postcss": "^8.4.5",
    "tailwindcss": "^3.0.18"
  }
}

実装のポイント

firebase側の設定をする

プロジェクトを新規作成

01.png

02.png

03.png

ウェブアプリを登録 apiKey

04.png

05.png

06.png

Authenticationの設定 ログインプロバイダにgoogleを加える

image.png

image.png

image.png

Next.js (next auth)

環境変数ファイルを作成 .env.local

firebase.jsのパラメータを設定

image.png

[...nextauth].jsで使うパラメータを設定

image.png

コード部分の実装

pages/api/auth/[...nextauth].js nextauthの設定ファイル

[...nextauth].js
import NextAuth from "next-auth"
import GoogleProvider from "next-auth/providers/google"


export default NextAuth({
    providers:[
        GoogleProvider({
            clientId:process.env.GOOGLE_CLIENT_ID,
            clientSecret:process.env.GOOGLE_CLIENT_SECRET,
        }),
    ],

    pages:{
        signin: "/auth/signin"
    }
})

pages/auth/signin ログインページ

signin.jsx
import {getProviders, signIn} from "next-auth/react";

export default function signin({providers}){
    return(
        <div className="flex justify-center mt-20 space-x-4">
        <img
          src="https://cdn.cms-twdigitalassets.com/content/dam/help-twitter/en/twitter-tips/desktop-assets/ch-01/ch12findphone.png.twimg.1920.png"
          alt="twitter image inside a phone"
          className="hidden object-cover md:w-44 md:h-80 rotate-6  md:inline-flex"
        />
        <div className="">
          {Object.values(providers).map((provider) => (
            <div className="flex flex-col items-center">
              <img
                className="w-36 object-cover"
                src="https://help.twitter.com/content/dam/help-twitter/brand/logo.png"
                alt="twitter logo"
              />
              <p className="text-center text-sm italic my-10">
                This app is created for learning purposes
              </p>
              <button
                onClick={() => signIn(provider.id, { callbackUrl: "/" })}
                className="bg-red-400 rounded-lg p-3 text-white hover:bg-red-500"
              >
                Sign in with {provider.name}
              </button>
            </div>
          ))}
        </div>
      </div>
    )
}

export async function getServerSideProps(){
    const providers = await getProviders();
    return{
        props:{providers
        },
    };
}

root/firebase.js firebaseの設定ファイル

firebase.js

import {initializeApp,getApp,getApps} from "firebase/app";
import {getFirestore, getFireStore} from "firebase/firestore";
import {getStorage} from "firebase/storage";
import { get } from "http";


const firebaseConfig = {
    apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
    authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
    projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
    storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGE_SENDER_ID,
    appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
    measurementId:process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENTID_ID,
};

const app = !getApps().length ? initializeApp(firebaseConfig) :getApp();
const db = getFirestore();
const storage = getStorage();
export{app,db, storage}

.env.local gitignoreされている

.env.local
GOOGLE_CLIENT_ID=74XXXXXXXXXXXXXXXXXXXX795.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOXXXXXXXXXXXXXXXXXXXXXXXXFzV
NEXT_PUBLIC_FIREBASE_API_KEY=AIzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFu0
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=twitterXXXXXXXXXXXX.firebaseapp.com
NEXT_PUBLIC_FIREBASE_PROJECT_ID=twitter-clone-fukushu
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=twitter-clone-fukushu.appspot.com
NEXT_PUBLIC_FIREBASE_MESSAGE_SENDER_ID=740XXXXXXXXXXX
NEXT_PUBLIC_FIREBASE_APP_ID=1:740XXXXXXXXXXXXXXXXXXXXXX
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=G-JXXXXXXX

リダレクトURL関係のエラーに対処するため Google Cloudの設定をする

リダレクトURL関係のエラー 原因はGoogleコンソール側の設定

ログインに失敗するのでこれを解消するために googleConsole側で設定を行います。
以下

2.png

プロジェクトを開く

プロジェクトが作成されているので、開きます。

プロジェクトを選択します。
0.png

認証情報のOAuth2.0クライアントIDを開いて、クライアントIDとクライアントシークレットが一致していることを確認します。

1.png

承認済みのリダイレクトURIに「http://localhost:3000/api/auth/callback/google」を加えます。

3.png

設定後googleアカウントでログイン画面が表示されます。

参考

css

javascript

Next.js

Next Auth

React

firebase

その他

Google Cloud

Udemy
76. Complete the signin page

githubコミット分

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?