본문 바로가기
  • 삽질하는 자의 블로그
메인-프로젝트/Next.js - 심리검사와 강아지 프로젝트

1. Google OAuth 구현하기 [TypeScript + Next.js + Next-auth]

by 이게뭐당가 2023. 1. 27.

매번 OAuth 를 사용하지 않고, 이메일, 비밀번호 로그인을 주로 사용해보았다.

 

남들 다하는 OAuth 도 해보고 싶어서, 간편하기도 하고 보안성도 더 좋아보여 도전해본다.

 

하나씩 하나씩 기록해가며 해보자.

 

1. TypeScript + Next.js 의 구성

 

https://nextjs.org/docs/basic-features/typescript#create-next-app-support

 

Basic Features: TypeScript | Next.js

Next.js supports TypeScript by default and has built-in types for pages and the API. You can get started with TypeScript in Next.js here.

nextjs.org

npx create-next-app@latest --ts

간단하게 설치해보자.

 

이번에 Next.js 13버젼이 되어 무언가 많이 바뀌었다고 한다.

저번에 Next.js 12버젼을 사용하면서, 서버측 코드를 사용하며 약간의 불편함을 느꼈었는데,

 

그것이 개선되고 Image 의 최적화가 더 나아지고, 뭐가 하여튼 많이 바뀌었다고 한다.

 

찾아보긴 했는데 정확히 기억나지는 않는다. 다시 찾아보면서 해야지.

 

2. next-auth 의 설치

 

https://next-auth.js.org/getting-started/example#existing-project

 

Getting Started | NextAuth.js

The example code below describes how to add authentication to a Next.js app.

next-auth.js.org

npm install next-auth

어려울게 있나. 간단하게 설치해보자.

 

3. next-auth 의 설정

https://next-auth.js.org/getting-started/example#add-api-route

 

Getting Started | NextAuth.js

The example code below describes how to add authentication to a Next.js app.

next-auth.js.org

 

기본적으로  pages / api / auth / [...nextauth].ts 위치에, 인증에 관련된 설정을 하게 되어있다.

 

제공하는 코드를 참조하여, 원하는 provider 를 생성하고, 값을 넣는다.

<pages/api/auth/[...nextauth].ts>

    import NextAuth from "next-auth";
    import GoogleProvider from "next-auth/providers/google";	// 원하는 OAuth 를 선택

    export default NextAuth({
      providers: [
        GoogleProvider({		// 원하는 OAuth 를 선택, 더 추가도 가능
          clientId: String(process.env.GOOGLE_CLIENT_ID),
          clientSecret: String(process.env.GOOGLE_CLIENT_SECRET),
        }),
      ],
    });

이제 Google 의 Provider 가 생성되었다.

 

 

4. SessionProvider 의 설정

 

앞서 만든 next-auth 의 설정을 Provider 를 통해, 앱 전역에 사용되게 만들어야한다.

next-auth/react 가 제공하는 SessionProvider 를 통해, 앱 전역을 감싸준다.

    < pages/_app.tsx >

        import type { AppProps } from "next/app";
        import {SessionProvider} from 'next-auth/react';
        
        const App = ({Component, pageProps}:AppProps) => {
            return (
                <SessionProvider session={pageProps.session}>
                    <Component {...pageProps} />
                </SessionProvider>
            );
        }
        
        export default App;

 

 

5. 로그인, 로그아웃, 세션정보의 접근

 

next-auth/react 가 제공하는 signIn, signOut, useSession 을 통해, 구현이 가능하다.

간단한 SignIn 버튼과 SignOut 버튼, 그리고 useSession 을 이용하여 값을 받아와본다.

< comonents / user-auth.tsx >
    
    import { signIn, signOut, useSession } from "next-auth/react";

    const SignInComponent = () => {
        const { data, status } = useSession();
        
        return (
            <div>
                <div>
                    <h1> 로그인</h1>
                    <button type="button" onClick={() => signIn()}>
                    	SignIn
                    </button>
                </div>
                <div>
                    <h1> 로그아웃</h1>
                    <button type="button" onClick={() => signOut()}>
                        SignOut
                    </button>
                </div>
            </div>
        );
    };

    export default SignInComponent;

 

 

6. 기본 세팅은 끝났다. 이제, Google 에 들어가서, OAuth 를 활성화시킨다.

 

구글 디벨로퍼 API 서비스에 들어가서, 프로젝트를 만든다.

 

7. 프로젝트를 만든다.

프로젝트 이름은 마음대로 만든다.

나는 dogs 라고 그냥 지었다.

 

8. 만든 프로젝트를 눌러, API 및 서비스 탭을 들어간다.

 

 

9. 사용자 인증 정보 탭에 들어가, API 키를 만든다.

 

 

만들어진 API 키는 잘 적어두자.

나의 경우에는 .config 파일을 따로 만들어, gitignore 에 등록하고, 모든 정보를 두는 편이다.

 

 

10. API 키를 만들었다면,  동의화면 구성에 들어가, 동의화면을 구성한다.

 

우리는 모든 구글 계정 사용자가 이용 가능해야 하므로, "User Type" 을 [ 외부 ]로 지정한다.

 

 

11. 필수적인 구성만 적어주고 넘어간다.

앱 이름은 그럴듯 하게 지어보았다.

사용자 지원 이메일에는, 안될시 문의 메일이 올 내 메일 주소를 적어보았다.

 

 

12. 범위를 지정한다.

사용자에 대한 기본 정보만 필요하므로, 필요한 두개만 체크해보았다.

 

 

13. 마지막으로 테스트 사용자만 지정해두면 화면 구성은 끝난다.

 

 

14. 동의 화면 구성이 끝났으니, 이제 진짜 클라이언트 ID 를 만들어본다.

 

15. 웹 애플리케이션으로 지정하면 아래 쭉 나온다.

 

Google OAuth 를 사용할 오리진을 적어준다.

추후, 배포하게 된다면, 배포되는 곳의 오리진을 반드시 적어어야 할 것이다.

 

현재는 개발서버를 적어놓았다.

 

리디렉션 URI 는 Next-auth 를 보고 그대로 가져간다.

물론, 이것역시 배포하게 된다면, 배포되는 곳의 오리진을 적고 뒤의 주소를 적어야 하겠다.

 

https://next-auth.js.org/providers/google#configuration

 

Google | NextAuth.js

Documentation

next-auth.js.org

 

16. 짜잔. 적고나면 OAuth 를 사용할 수 있는 클라이언트의 ID 가 생성된다.

반드시 적어두자.

 

next.js 의 루트폴더에 .env 를 만들어서, 그 안에 적어두어야

미리 생성했던 next-auth 의 provider 옵션에 적어두었던 환경변수에

그 값이 들어가서 사용이 가능해진다.

 

17. 끝났다. 이제 로그인을 해보자

 

기가맥히게 로그인이 되었다.

 

 

심지어 새로고침을 해도 풀리지가 않아!! 우와!!

 

자동으로, 쿠키에 token이 저장되는 모습이다. 

expire date 가 있는 지속적 쿠키로,

이 쿠키는 일부로 지우지 않는다면 탭을 닫아도 만료날짜까지 삭제가 되지 않을것이다.

로그인 전과 로그인 후

이렇게 Google로그인을 해보았다.

 

스타일링도 바꿔보자 다음 시간에

댓글