npm install next-auth
kakao, naver, google 기본적으로 다 제공하고 있어서 좋음.
❗️이미지에서는 개발환경에서 테스트를 위해 로컬 호스트 주소를 입력하였음.
배포후에는 배포 주소에 맞게 변경해주어야 정상 작동 됨.
서비스 URL
: 서비스 웹사이트 URL 입력Callback URL
: 웹사이트 주소 + /api/auth/callback/naver
이 Callback URL
을 반드시 지켜야한다...
이거 내가 임의로 주는건줄 알고 아무거나 줬더니 500 에러가 계속 떴다
여러분들은 그런 실수 하지 마시길 😅
client ID와 client Secret을 env에 등록하자.
NEXTAUTH_CLIENT_ID = ***
NEXTAUTH_CLIENT_SECRET = ***
위와 같이 env에 등록해 줘야한다.
키 값이 노출되지 않도록 NEXT_PUBLIC_
을 사용하지 않아야 한다.
그럼 이제 준비 완료!!
❗️ 파일 경로에 특히 유의해 주세요.
그리고 코드는 그냥 복붙하는게 정신 건강에 좋음..
import NextAuth from 'next-auth/next';
// 특히 이부분 경로에 주의 요망
import NaverProvider from 'next-auth/providers/naver';
// env를 상수화 해서 불러오고 있음
import { API_NAVER_CLIENT_ID, API_NAVER_CLIENT_SECRET } from '@shared/constants/oauth';
const options = {
providers: [
NaverProvider({
clientId: API_NAVER_CLIENT_ID,
clientSecret: API_NAVER_CLIENT_SECRET,
}),
// kakao, google 등 원하는 OAuth 여러개 추가 가능
],
};
export default NextAuth(options);
파일 경로 / 파일 이름, 그리고
next-auth/providers/naver
경로에 유의해서 작업하길 바람...
이것 때문에 고생을 많이 했으니까 ㅜㅡㅜ
import { SessionProvider } from 'next-auth/react';
import type { AppProps } from 'next/app';
export default function App({ Component, pageProps: { session, ...pageProps } }: AppProps) {
return (
<>
...
<SessionProvider session={session}>
<Component {...pageProps} />
</SessionProvider>
...
</>
);
}
session 정보를 담은 useSession 훅을 사용하기 위함이다.
// signIn을 next-auth에서 불러와야함
import { signIn } from 'next-auth/react';
import * as S from './oauth-box-style';
const OauthBox = () => {
return (
<S.OauthBox>
...
<button type='button' onClick={() => signIn('naver', { redirect: true, callbackUrl: '/' })}>
네이버
</button>
...
</S.OauthBox>
);
};
export { OauthBox };
참고로 로그아웃도 간편하게 가능함
<button type='button' onClick={() => signOut()}>로그아웃</button>
이렇게 해주면 끝이다.
로컬 환경에서는 문제가 전혀 없었다.
그런데 vercel에 배포 후, 자꾸만 500에러가 떴다.
환경 변수가 잘 못되었을 수도 있으니까 확인해봤는데 문제 없었다.
그래서 온갖 뻘짓을 다 해봤는데,,, 전혀 효과 없었음 ^^
버셀 네 이놈,,,,,,,,,,,,,
알고봤더니,
NEXTAUTH_CLIENT_ID = ***
NEXTAUTH_CLIENT_SECRET = ***
위에서 미리 설정해주었던 두 환경 변수 이외에도, 두개가 더 필요하더라!
NEXTAUTH_URL = 홈페이지 주소/api/auth/signin
NEXTAUTH_SECRET = ***
NEXTAUTH_URL
: 홈페이지 주소/api/auth/signinNEXTAUTH_SECRET
: 발급을 받아서 넣어 줘야함$ openssl rand -base64 32
터미널에서 해당 커맨드 라인을 입력하면 특정 값을 반환해준다.
해당 값을 환경 변수에 넣어주도록 하자!
아 이것도 모르고 꽤나 고생했다 ㅎㅎㅎㅎㅜㅜ