하수라 + 슈퍼토큰

고유한 사용자 인증 코드를 작성해야 합니까? 몇 가지 새로운 애플리케이션을 구축할 준비를 하면서 이 질문이 가장 먼저 떠오릅니다. 저는 일반적으로 앱의 가장 중요한 부분을 제3자에게 넘겨준다는 생각이 매우 불편합니다. 그 제3자가 구글이나 페이스북이고 그들이 요즘 도덕적 권위자라고 생각하는 것 같아서 당신을 검열해야 한다고 결정한다면 어떨까요? 이러한 위험 외에도 사용자 지정 인증 구현에 적용할 수 있는 몇 가지 다른 장단점이 있습니다.

장점
  • 전체 제어
  • 벤더 종속 없음
  • 비용 절감

  • 단점
  • 유지 관리할 추가 코드
  • 다른 데이터베이스의 사용자 레코드
  • 알려지지 않은 취약점의 높은 위험

  • 최근 비디오에서 Supertokens에 대해 들었습니다. 오픈 소스이고 postgres에서 실행되며 자체 호스팅이 가능하기 때문에 타사 인증 사용과 관련된 일부 문제를 제거할 수 있는지 확인하고 싶었습니다.

    가장 빨리 시도해 볼 수 있는 방법은 사용자 지정 JWT 대신 인증에 Supertoken을 사용하도록 내 코드Hasura Starters를 리팩토링하는 것이었습니다.

    내 기존 코드베이스는 몇 가지custom actions를 사용하여 공통 인증 워크플로를 제공합니다.
  • 등록기
  • 로그인
  • 후아미
  • 비밀번호 변경
  • 사용자 파괴
  • 비밀번호 재설정

  • Supertokens에서 제공하는 UI 구성 요소를 사용하는 대신 사용자 지정 코드 대신 Supertokens와 상호 작용하도록 각 작업을 다시 작성하고 싶었습니다. 모든 것이 멋지게 밝혀졌습니다! 예를 들어, 손으로 만든 모든 사용자 등록 코드는 다음 한 줄로 바뀌었습니다.

    const signup = await EmailPassword.signUp(email, password)
    


    다른 모든 사용자 지정 작업도 쉽게 변환할 수 있었습니다. 약간 못생긴 유일한 코드는 jwt가 로그인 작업( based on this code )에서 반환되도록 하는 프로세스입니다.

    await Session.createNewSession(res, user.id)
    let sessionHandles = await Session.getAllSessionHandlesForUser(user.id)
    let token = ''
    
    for (const handle of sessionHandles) {
      const sessionInfo = await Session.getSessionInformation(handle)
      const jwt = sessionInfo.accessTokenPayload["jwt"]
      if (jwt) {
        token = jwt
      }
    }
    


    사용자에게 많은 세션이 있는 경우 여기서 무슨 일이 일어날지 잘 모르겠습니다. createNewSession에 제공되는 응답 개체도 사용자 브라우저의 요청이 아니라 노드에 대한 Hasura의 호출에서 나옵니다. 응답 객체가 필요하지 않은 createNewSession 버전이 있으면 좋을 것입니다.

    슈퍼토큰에 대해 내가 찾은 다른 좋은 점은 다음과 같습니다.
  • 이메일을 사용자 정의하는 방법을 제공합니다(또는 이메일 확인 및 암호 재설정 토큰을 직접 생성).
  • 내 앱과 동일한 postgres 인스턴스에 데이터를 저장할 수 있었습니다.
  • Docker 이미지는 사용 및 사용자 정의가 쉬웠습니다.
  • 프로젝트가 GitHub에서 활성 상태입니다.

  • 그러나 앞으로의 프로젝트에서 슈퍼토큰을 사용할 것인지 아직 100% 확신할 수 없습니다. 장기적인 부채가 될 수 있다고 걱정되는 몇 가지 사항이 있습니다.
  • 데이터베이스 스키마가 단편화되어 사용하기 어렵습니다.
  • 설명서를 탐색하기 어려울 수 있습니다.
  • 암호 변경 시 기존 JWT를 만료하기 어렵습니다(토큰 블랙리스트를 구현해야 함).
  • Supertoken이 유지되지 않는 경우 전환 경로는 어떻게 됩니까?
  • 사용자가 별도의 스키마(또는 데이터베이스)에 있을 때 어떻게 다중 테넌트 역할이 Hasura 내에서 구현될 수 있습니까?
  • 좋은 웹페이지 즐겨찾기