inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Next + React Query로 SNS 서비스 만들기

회원가입 실제로 하기

회원가입 리다이렉트 오류

437

Jinhye Kim

작성한 질문수 3

0

현재 상태는 201로 불러와도 redirect가 되지 않습니다.

console.log()로 찍어보니 await signIn 이후로는 console.log()가 찍히지가 않았습니다.
axios로 바꿔봐도 그대로이고 버전도 @auth/core 버전도 바꿔보았는데 꿈쩍 않습니다 ㅠ 물론 DB에도 정상적으로 데이터가 저장되고요.. 시간만 날리다가 도저히 안되겠기에 질문 남깁니다..

signup.ts

"use server";

import { signIn } from "@/auth";
import { redirect } from "next/navigation";
// import axios from "axios";

export default async (prevState: any,formData: FormData) => {
  // 입력값이 없거나 || 빈칸이 존재하지않을때
  if (!formData.get("id") || !(formData.get("id") as string)?.trim()) {
    return { message: "no_id" };
  }
  if (!formData.get("name") || !(formData.get("name") as string)?.trim()) {
    return { message: "no_name" };
  }
  if (!formData.get("password") || !(formData.get("password") as string)?.trim()) {
    return { message: "no_password" };
  }
  if (!formData.get("image")) {
    return { message: "no_image" };
  }
  formData.set("nickname", formData.get("name") as string);
  let shouldRedirect = false;

  try {
    const response = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/users`,{
        method : 'post',
        body: formData,
        credentials: "include", // 쿠기 전달 가능캐 함
      });
      console.log("회원가입상태 : ",response.status);
      
      // 회원가입시 이미 가입되어있을때
      if (response.status === 403) {
        return { message: "user_exists" };
      }

      shouldRedirect = true;
      await signIn("credentials", {
        username: formData.get('id'),
        password: formData.get('password'),
        redirect: false,
      })
    } catch (err) {
      console.error(err);
      return {message : null};
    }
    console.log("11")
    
    if (shouldRedirect) {
      console.log("리다이랙트");
      redirect("/home");
    }

    return { message: null};
};

 

 

react next.js react-query next-auth msw

답변 2

0

제로초(조현영)

회원가입 후 로그인이 안 되시는 것 같은데요. 로그인 시에는 어디까지는 제대로 되는지 확인이 필요합니다. auth.ts에서 어느부분까지 콘솔이 찍히는지 확인해보세요.

0

Jinhye Kim

클라이언트 console.log

스크린샷 2024-03-25 오후 10.59.30.png

서버 console

스크린샷 2024-03-25 오후 10.59.59.png 이런식으로 나옵니다

1

제로초(조현영)

그 콘솔이 코드 어느 부분인가요?

0

Jinhye Kim

스크린샷 2024-03-25 오후 11.12.34.png클라이언트는 signup.ts 이부분에서 출력이 되고 있습니다.

1

제로초(조현영)

아뇨 여기 말고 authorize 함수요. auth.ts. 거기는 호출된다는 거 이미 알고 있습니다.

0

Jinhye Kim

import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials";

export const  {
  handlers: {GET,POST},
  auth,
  signIn,
} = NextAuth({
  pages: {
    signIn: '/i/flow/login',
    newUser: '/i/flow/signup',
  },
  providers: [
    CredentialsProvider({
      async authorize(credentials) {
        const authResponse = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/login`, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            id : credentials.username,
            password : credentials.password,
          }),
        })

        if (!authResponse.ok) {
          return null
        }

        const user = await authResponse.json()


        return {
          email : user.id,
          name : user.name,
          image : user.image,
          ...user,
        }
      },
    }),
  ],
});

auth.ts에서는 특별하게 건든것이 없습니다..

1

제로초(조현영)

제가 authorize에서 어디까지 실행되는지 콘솔로그 찍어보라고 한 이유는 거기서 문제가 있기 때문에 로그인이 안 되고있는 겁니다. signIn에서 안된다는 건 authorize 함수에서 에러가 나고있는 겁니다. fetch 전후로 콘솔로그 찍어보세요. authResponse.json() 뒤에도요

0

Jinhye Kim

import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials";
import {NextResponse} from "next/server";
import axios from 'axios'

export const {
  handlers: { GET, POST },
  auth,
  signIn,
} = NextAuth({
  pages: {
    signIn: '/i/flow/login',
    newUser: '/i/flow/signup',
  },
  providers: [
    CredentialsProvider({
      async authorize(credentials) {
        console.log("authorize function started");
        const authResponse = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/login`, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            id: credentials.username,
            password: credentials.password,
          }),
        })

        console.log("fetch executed");

        if (!authResponse.ok) {
          console.log("authorization failed");
          return null
        }

        const user = await authResponse.json()
        console.log('user', user);
        
        return {
          email: user.id,
          name: user.nickname,
          image: user.image,
          ...user,
        }
      },
    }),
  ]
});

authResponse 이후의 console.log가 찍히질 않네요..

스크린샷 2024-03-26 오전 12.13.12.png

 

1

제로초(조현영)

네 그럼 fetch가 문제라는 걸 확인한 겁니다.

process.env.NEXT_PUBLIC_BASE_URL이랑 credentials도 로그찍어보시고

백엔드 콘솔에도 에러 없는지 한 번 봐보세요.

1

Jinhye Kim

스크린샷 2024-03-26 오전 12.27.26.png스크린샷 2024-03-26 오전 12.33.17.png

모두 정상출력이 되는것 같습니다...

1

제로초(조현영)

혹시 redis 설치하셨나요? 그리고 실행도 하셨나요?

https://www.inflearn.com/questions/1106838/npm-run-start-dev-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89%EC%8B%9C-error-connect-econnrefused-1-6379-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D

 

0

Jinhye Kim

제가 mac을 사용하는데 게시해주신 링크에서 확인해보니 redis-server 를 따로 켜준 후 npm run start:dev를 켜는 것이였군요 ㅠㅠ 늦은시간까지 도움주셔서 감사합니다. 좋은하루 보내세요 :)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. Jinhye Kim님의 질문에 대해 관련된 기존 질문을 찾아보았습니다. 질문의 주요 내용은 회원가입 후 signIn 함수 이후 redirect가 작동하지 않는 문제와 관련있어 보입니다.

잠재적인 해결 방안을 제시한 다음 링크를 확인해보시기 바랍니다:
- 로그인 문제 - 이 게시글에서는 next-auth 라이브러리를 사용할 때 발생할 수 있는 로그인 관련 리다이렉트 문제를 다루고 있습니다. 특히 signInrouter.replaceredirect가 예상대로 동작하지 않는 이슈를 지적하고 있네요. 비록 상황은 조금 다르지만 로그인 후 페이지 이동 처리에 대해 유용한 정보를 얻을 수 있을 것입니다.

게시물에서는 특정 버전의 라이브러리에 문제가 있을 수 있음을 언급하고 있으며, 로그인 후 리다이렉트 처리 방법에 대한 내용도 포함되어 있습니다. 질문자님의 경우 signIn 함수와 redirect 작업 사이에 문제가 발생하는 것으로 보이는데요, 라이브러리의 버전을 살펴보고 해당 게시글의 방법대로 시도해보시는 것이 도움이 될 수 있습니다.

질문자님의 문제와 가장 유사한 부분은 signIn 함수가 성공적으로 실행된 후 페이지 이동, 즉 redirect가 정상적으로 이뤄지지 않는 부분입니다. 오류 메시지나 console.log를 통해 어디까지 코드가 실행되는지 확인한 후, 해당 게시글에서 제시한 해결책을 시도해 볼 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

캡처링부분 질문있습니다.

0

74

2

깃에 소스코드를 찾을 수 없습니다.

0

113

2

useInfiniteQuery promise와 react use 사용시 페이지 무한 로딩

0

98

1

import 파일 경로를 찾지 못 해서 에러가 발생합니다.

0

109

2

css 라이브러리 추천 부탁드립니다

0

140

2

팔로우 추천 목록이 빈 배열로 들어옵니다.

0

130

1

게시물 업로드 시 userId가 undefined로 들어가는 오류

0

119

1

useSuspenseQuery 사용 시 SSR 401 이슈 관련

0

171

1

리액트 쿼리 useinfinitequery 무한스크롤 구현 시 페이지가 이동할 경우 데이터가 보존되게 할 수 있나요??

0

184

3

폴링이 필요없는 이유

0

93

2

next Request Memoization과 react cache

0

108

2

seo 최적화 기준은 데이터 fetching인가요 아님 데이터 렌더링인가요?

0

84

2

next.js 서버fetch 에러 fallback ui 구현 방법

0

173

2

프레임워크 여론 파악법

0

125

2

필터옵션이 많은 페이지에서 서버 fetch를 하는게 맞는걸까요??

0

103

2

서버 fetch suspense 로 감싸고 새로고침 시 잠시 빈 화면이 노출된 후 fallback ui가 노출됩니다.

0

102

2

template.tsx 내 서버fetch 응답값과 클라이언트 컴포넌트 상태값 싱크가 맞지 않는 이슈

0

66

2

Auth.js 사용 시 authorize 함수가 호출되지 않습니다

0

131

2

next.js 에서 로그인에 관하여

0

138

1

Next의 route handler에 대한 질문이 있습니다.

0

101

2

게시판 리스트 만들때 use client를 어디서부터 집어넣어야할지 모르겠습니다

0

97

2

프라이빗 폴더를 해야 하는 이유가 모호한 것 같아요.

0

85

2

vanilla-extract 못찾는 문제

0

229

2

fetch 캐싱과 revalidate 관련

0

84

2