inflearn logo
강의

Course

Instructor

Svelte REST-API project

첫 메인 화면 $isLogin 인증 부분 궁금한점이 있습니다.

Resolved

550

shimpark

1 asked

0

처음 화면에서 http://127.0.0.1:3012 을 호출하면 http://127.0.0.1:3012/articles/all 주소로 자동 이동합니다.

궁금한 점은 articles/all 화면에서 제일 상단에 인증되면 보이는 입력칸이 보입니다.

 

{#if $isLogin} 으로 조건이 되어도 true 인지 입력칸이 보입니다.

로그아웃 버튼을 누르면 로그인을 하지 않은 첫화면인데 작동이 되어 로그아웃으로 해제 됩니다. 이 부분이 궁금합니다.

 

<script>
  import ArticleHeader from '../components/ArticleHeader.svelte';
  import ArticleList from '../components/ArticleList.svelte'
  import ArticleAddForm from '../components/ArticleAddForm.svelte'
  import Comments from '../pages/Comments.svelte'
  import { isLogin } from '../stores'
  import { Route } from 'tinro'  
</script>
<ArticleHeader />
<main class="slog-main ">
  {#if $isLogin}
    <ArticleAddForm />
  {/if}
  <ArticleList />

  <Route path="/comments/:id" >
    <Comments />
  </Route>  
</main>

 

function setIsLogin() {
	const checkLogin = derived(auth, $auth => $auth.Authorization ? true : false)
  return checkLogin
}

 

 

rest-api svelte 인증 islogin

Answer 2

1

Indie Coder

인증의경우 한번로그인하면 쿠키에 인증토큰이 저장되었다가 앱을 실행시키면 해당토큰으로 로그인이 확인됩니다

이 과정은 auth스토어의 refresh 부분을 보시면됩니다

그리고 isLogin 스토어는 이 auth 스토어를 참조해서 해당스토어에 로긴정보의 유무를 반응형으로 감지합니다 그래서 로긴정보가 있으면 true 가 되어입력창등을 보여주고 로그아웃이 발생해 auth 스토어가 초기화되면 false가 되어 입력창등이 사라지게 됩니다

이부분은 svelte의 reactivity 즉 반응성으로 작동되는 부분입니다

0

shimpark

넵 답변 감사합니다. .😍😍😍😍

 

처음 화면에서 http://127.0.0.1:3012 을 호출하면 http://127.0.0.1:3012/articles/all 주소로 이동하죠. 그 다음 로그인을 하고 작성하다가, 로그아웃을 했습니다.

로그아웃한 상태에서 다시, http://127.0.0.1:3012 로 접속하면 http://127.0.0.1:3012/articles/all 주소로 이동하게 되고 여기서 이상하게 로그아웃된 화면인데도 입력칸이 상단에 보입니다. 그 상태에서 작성하게 되면 인증정보가 없어서 그런지 오류 발생합니다. 입력칸을 보이고 감추는 것은 $isLogin 으로 체크하는 부분을 살펴 봤습니다.

여기서 github 소스에서는 인증쿠기가 담겨져 있는 auth.Authorization 으로 체크한 부분이 있습니다. 이 부분은 로그아웃 해도 계속 남는 현상이 발생해서 id 값으로 교체해 봤습니다.

function setIsLogin() {
	const checkLogin = derived(auth, $auth => $auth.Authorization ? true : false)
  return checkLogin
}

아래와 같이 사용하면 id 값이 undefind 나와서 false 로 표기되어 전체적으로 비인증여부를 체크해주어서 잘된거 같습니다.

function setIsLogin() {
	const checkLogin = derived(auth, $auth => $auth.id ? true : false)
  return checkLogin
}

 

로그아웃 로직에는 문제 없어 보이는데요. 왜 authorize 에는 값이 계속 남겨지는지는 미스터리인 사항이네요. 나중에 더 공부해서 찾아보겠습니다.

 

  const logout = async () => {
		try {
      const options = {
        path: '/auth/logout',
      }

      await delApi(options)
      set({...initValues})
      isRefresh.set(false)
      // router.goto('/')
      articlesMode.changeMode(ALL)
    }
    catch(error) {
      alert('오류가 발생했습니다. 다시시도해 주세요')
    }
	}

 

0

Indie Coder

제가 이번주는 개인사정으러 코드를 보기 힘들어 주말에 다시한번 작동부분을 확인해 보겠습니다

0

Indie Coder

일단 위의 문제가 정확히 재현 되지는 않았습니다.

비슷문제가 발생할 수 있는 부분을 조금 확인해 보니 도메인 관련 문제가 아닐가 생각됩니다

백엔드 서버에서 main.js와 services/authService.js에서

다음과 같이 쿠키 생성에서의 domain설정 부분을 127.0.0.1 로 설정하고

fastify.register(fasstifyCookie, {  
  // domain:'http://localhost/',
  domain:'http://127.0.0.1/',
  secret: "my-secret", // for cookies signature
  hook: 'onRequest', // set to false to disable cookie autoparsing or set autoparsing on any of the following hooks: 'onRequest', 'preParsing', 'preHandler', 'preValidation'. default: 'onRequest'
  parseOptions: {}  // options for parsing cookies  
})

 

  rep.setCookie('refresh_token', refreshToken, {
    // domain: 'localhost',
    sameSite:'none',
    secure: true,
    httpOnly: true,
    path: '/',
    expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7),
  })  

 

그리고 프런트엔드에서도 service/api.js에서도 127.0.01:포트로 해주셔야 합니다.

const send = async ({method='', path='', data={}, access_token=''} = {}) => {
  const commonUrl = 'http://127.0.0.1:3000'
  // const commonUrl = 'http://localhost:3000'
  // const commonUrl = 'http://localhost:3012'
  // const commonUrl = 'http://localhost:8089'
  const url = commonUrl + path

 

현재 서버 버전에서는 localhost가 아닌 127.0.0.1 로 접속하면 도메인 문제로 인해 쿠키가 생성되지 않을 수 있는 것 같습니다.

이부분 시도해 보시고 그래도 문제가 있다면 아래 이메일로 코드를 압축해서 보내주시면 따로 확인해 보겠습니다.

freeseamew@gmail.com

스프링부트 서버 에러나요

0

17

1

DDD 는 마이바티스와 잘 맞지 않는건가요?

0

46

1

스프링부트 버전 문의드립니다.

0

38

1

Dto와 Entity 사용 관련 질문

0

31

2

강의 자료 코드

0

39

2

application.properties 작성 관련 질문

0

45

2

cascade 질문

0

39

1

관리자 페이지 상품 삭제 API

1

32

1

@types/bcrypt 설치과정이 누락된것같습니다.

0

48

1

process.env port key 에러

0

46

1

추상화

0

50

1

이미지 처리 라우트 관련 문의

0

67

2

지금 이게 맞는건지 문의드립니다.

0

44

1

프론트 api.js의 요청 headers 옵션의 cors 관련 설정 질문

0

61

2

[npm start 오류나는 분들을 위하여]노드 최신버전 사용하시면 오류가 발생합니다.

0

397

1

[앱 완성도 높이기3 - URL을 통한 보기모드 변경] 로그인 성공 후 라우팅 문제

0

311

1

[앱 완성도 높이기2 - 날짜보기] 타임존 관련 설정 문제

0

1556

1

[보기모드 변경 구현] 코멘트 리스트 조회 후 문제

0

448

2

[보기모드 변경 구현] 좋아요 보기 구현에서 문제 발견

0

423

1

[인증 구현 - 컴포넌트] error 처리 관련 질문

0

392

1

[인증 구현 - store] setAuth 메소드 구현

0

355

1

[스토어 배치] 강의 내용 중 수정이 필요한 부분

0

344

1

[라우터 설정] 강의 내용 중 수정이 필요한 부분

0

576

1

아래와 같은 에러가 발생합니다. ㅜㅜ

0

1245

2