inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

포트폴리오 리펙토링

section 46 퀴즈 관련 질문입니다

해결된 질문

379

현정

작성한 질문수 11

0

퀴즈를 해결하려고 해당 코드를 작성했는데 로그인을 하려고 하면 Context creation failed: 토큰 만료라는 400 오류가 뜹니다. (새로 가입해서도 해봤는데 똑같은 오류가 떴습니다.)

또한 useAuth를 사용했는데도 로그인 없이 성공페이지로 바로 접속됩니다. 뭐가 문제일까요?

useAuth

 

export const useAuth = ():void => {
  const router = useRouter()
  useEffect(()=>{
    if(localStorage.getItem("accessToken")===null){
      alert("로그인 ㄱ")
      void router.push("/z_quiz/section46/02")
    }},[])
}

완료 코드

 

import { gql, useQuery } from "@apollo/client"
import type { IQuery } from "../../../../src/commons/types/generated/types"
import { useAuth } from "../../../../src/components/commons/hooks/useAuth"
const FETCH_USER_LOGGED_IN = gql`
  query {
    fetchUserLoggedIn {
      email
      name
    }
  }
`
export default function LoginSuccessPage():JSX.Element {
  const { data } = useQuery<Pick<IQuery,"fetchUserLoggedIn">>(FETCH_USER_LOGGED_IN)
  useAuth()
  return <>{data?.fetchUserLoggedIn.name}님 환영합니다.</>
}

로그인 코드

/* eslint-disable @typescript-eslint/no-misused-promises */
import { gql, useMutation } from "@apollo/client"
import { type ChangeEvent, useState } from "react"
import type { IMutation, IMutationLoginUserArgs } from "../../../../src/commons/types/generated/types"
import { useRecoilState } from "recoil"
import { accessTokenState } from "../../../../src/commons/stores"
import { useRouter } from "next/router"
const LOGIN_USER =gql`
  mutation loginUser($email:String!, $password:String!){
    loginUser(email:$email,password:$password){
      accessToken
    }
  }
`
export default function LoginPage():JSX.Element {
  const router = useRouter()
  const [email, setEmail] = useState('')
  const [password, setPassword] = useState('')
  const [loginUser] = useMutation<Pick<IMutation,"loginUser">,IMutationLoginUserArgs>(LOGIN_USER)
  const [, setAccessToken] = useRecoilState(accessTokenState)
  const onChangeEmail = (event: ChangeEvent<HTMLInputElement>):void => {
    setEmail(event.currentTarget.value)
  }
  const onChangePassword = (event: ChangeEvent<HTMLInputElement>):void => {
    setPassword(event.currentTarget.value)
  }
  const onClickLogin = async ():Promise<void> => {
    try {
      const result = await loginUser({variables: { email, password }}) 
      const accessToken = result.data?.loginUser.accessToken

      if (accessToken=== undefined) {
        alert("로그인 실패")
        return ;}
      setAccessToken(accessToken)
      localStorage.setItem("accessToken", accessToken)
      void router.push("./success.tsx")
    } catch(error) {
      if (error instanceof Error ) alert(error.message)
    }
  }
  return (
    <>
    이메일: <input type="text" onChange={onChangeEmail} />
    비밀번호: <input type="password" onChange={onChangePassword} />
    <button onClick={onClickLogin}>로그인</button>
    </>
  )
}

react node.js seo graphql next.js

답변 1

0

노원두

안녕하세요! 현정님!

"토큰만료"라는 메시지가 발생한 것으로 보아, 현재 localStorage에 accesstoken이 저장되어 있고, 이 accesstoken의 만료 시간 1시간이 이미 지난 것으로 보입니다.

accesstoken을 삭제하고, 다시 한 번 로그인 시도해 보세요!^^

0

현정


Application error: a client-side exception has occurred (see the browser console for more information). 넘어간 페이지에서 해당 문구가 뜹니다.

예전에 만든 모든 gql을 사용해 값을 만들고 조회하는 페이지가 같은 이슈로 인해 작동하지 않습니다.

0

노원두

네! 현정님!

위에서 말씀드린 방법으로 해결이 되지 않으신다면,
관련된 1)에러스크린샷과 network 탭의 2)HTTP Header, 3)Payload, 4)Response 총 4장을 보여주시면 확인 후 답변 드리도록 하겠습니다!^^

0

현정

image에러 사진입니다! 05-09 다이나믹 라우팅 페이지입니다.

0

노원두

네! 현정님!

올려주신 사진의 마지막장에서 Bearer eyJhb~~~ 되어있는 부분이 accesstoken 입니다! 이 부분의 eyJhb~~~ 부분을 복사하시어 jwt.io(수업에서 진행했던 사이트)에 접속하셔서 exp 만료시간을 확인해 보시면, 만료시간이 지난 것을 확인하실 수 있어요

해결 방법으로는, localstorage에 있는 accesstoken을 삭제해 주시고 다시 로그인하셔서 확인하시면 Bearer 뒷부분의 문자열이 새롭게 바뀐 것을 확인하실 수 있답니다!

이렇게하여 만료시간이 늘어난 토큰으로 다시 시도해 주세요!

1

현정

고쳐졌습니다 감사합니다~

fetchBoardsOfMine, fetchBoardsCountOfMine 에러 문의드립니다

0

36

1

댓글 기능 구현 중 질문드립니다.

0

66

1

쿠폰코드 발급

0

132

2

example 서버 플레이그라운드, API 접속 모두 안됩니다.

0

86

2

문의드립니다!! ㅠㅠ

0

101

2

graphql 백엔드 서버가 포폴용 빼곤 접속이 안됩니다.

0

76

2

_app.js 작성 이후로 에러가 발생하네요

0

93

2

학습자료

0

70

2

학습자료가 안열립니다.

0

49

2

플레이 그라운드 퀴즈 문제 질문이 있습니다.

0

59

0

기존강의 구매자, 업데이트 끝인가요?

0

109

3

업데이트 버전 수강

0

88

2

완벽한 프론트엔드

0

136

2

나만의 쇼핑몰 샘플 페이지 접속 확인부탁드립니다.

0

82

1

graphql 접속이 안됩니다.

0

100

2

const, let 사용 질문 드립니다.

0

70

2

싸이월드 만들기 1탄 피드백 부탁드립니다.

0

122

2

회원가입 과제 피드백 부탁드립니다.

0

80

2

styled.span / styled.input "CSS 자동완성"

0

47

1

쿠폰 발급 관련

0

166

2

서버 502 error

0

247

2

쿠폰 다시 부탁드려도 될가여?

0

140

2

a태그 패딩했을때 왜 크기가 줄어들지 않고 늘어나나요

0

184

2

2분 44초 질문

0

131

3