매번 OAuth 를 사용하지 않고, 이메일, 비밀번호 로그인을 주로 사용해보았다.
남들 다하는 OAuth 도 해보고 싶어서, 간편하기도 하고 보안성도 더 좋아보여 도전해본다.
하나씩 하나씩 기록해가며 해보자.
1. TypeScript + Next.js 의 구성
https://nextjs.org/docs/basic-features/typescript#create-next-app-support
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
npm install next-auth
어려울게 있나. 간단하게 설치해보자.
3. next-auth 의 설정
https://next-auth.js.org/getting-started/example#add-api-route
기본적으로 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
16. 짜잔. 적고나면 OAuth 를 사용할 수 있는 클라이언트의 ID 가 생성된다.
반드시 적어두자.
next.js 의 루트폴더에 .env 를 만들어서, 그 안에 적어두어야
미리 생성했던 next-auth 의 provider 옵션에 적어두었던 환경변수에
그 값이 들어가서 사용이 가능해진다.
17. 끝났다. 이제 로그인을 해보자
기가맥히게 로그인이 되었다.
심지어 새로고침을 해도 풀리지가 않아!! 우와!!
자동으로, 쿠키에 token이 저장되는 모습이다.
expire date 가 있는 지속적 쿠키로,
이 쿠키는 일부로 지우지 않는다면 탭을 닫아도 만료날짜까지 삭제가 되지 않을것이다.
이렇게 Google로그인을 해보았다.
스타일링도 바꿔보자 다음 시간에
'메인-프로젝트 > Next.js - 심리검사와 강아지 프로젝트' 카테고리의 다른 글
5. POST 를 이용한 데이터 가져오기, 로컬스토리지에 저장하기 (0) | 2023.02.03 |
---|---|
4. Redux-toolkit을 사용해 "비동기함수(fetch)" 를 이용한 DB 의 값 받아와서 넣기 + Thunk 생성자 + action.ts (0) | 2023.01.29 |
3. DB의 데이터를 fetch - "API" 를 통한 GET 과 "사전 데이터페칭"을 통한 GET (0) | 2023.01.28 |
2. MongoDB 연결과 API 를 통한 fetch(1) - MongoDB 연결 (0) | 2023.01.28 |
0. 프로젝트를 시작해보자! (0) | 2023.01.27 |
댓글