programing

Firebase 3에서 토큰에 대한 서버 측 검증이 여전히 가능합니까?

cafebook 2023. 7. 22. 10:25
반응형

Firebase 3에서 토큰에 대한 서버 측 검증이 여전히 가능합니까?

Firebase 3에서 토큰에 대한 서버 측 검증이 여전히 가능합니까?

기존 인증 시스템(서비스 계정 사용)을 사용하여 Golang을 실행하는 서버에서 사용자 지정 토큰(JWT)을 생성합니다.토큰은 iOS 클라이언트에서 다음을 사용합니다.

FIRAuth.auth()?.signInWithCustomToken(customToken)

거기까지는 모든 것이 잘 작동합니다.그러나 클라이언트 토큰을 다음에서 검색한 서버에 전달할 때:

FIRUser.getTokenWithCompletion({ token, error in ..})

우리는 그것을 확인할 수 없습니다.JWT 토큰은 RS256을 사용하여 서명되며 헤더가 있습니다.우리가 알아볼 수 없는 아이.사용자 지정 토큰에 서명하는 데 사용된 서비스 계정의 공용 키가 클라이언트 토큰을 확인하지 않습니다.클라이언트 토큰의 유효성을 검사하는 데 공용 키가 필요합니까?

verifyId를 사용하여 클라이언트 토큰의 유효성을 검사할 수 있습니다.토큰"은 자바나 자바스크립트로 호출하지만, 우리는 여전히 표준 JWT 라이브러리를 사용하여 골랑에서 이를 수행할 수 있기를 바랍니다.

이 모든 것이 Firebase 2에서 잘 작동했습니다(HS256 및 Firebase 비밀 사용).

짧은 대답은 '그렇습니다'입니다.전체적인 대답은, 대부분의 경우, 우리는 지금 더 적절한 도구를 가지고 있다는 것입니다.따라서 해결하려는 사용 사례에 따라 많은 부분이 달라집니다.

새로운 SDK 버전은 훨씬 더 강력하며, 기능을 요약하는 작업을 제대로 수행하지 못했습니다.여기서는 사용 가능한 도구와 사용 방법을 비교하기에 좋은 곳으로 보입니다. 마지막에 타사(예: Go) 관련 참고 사항을 살펴보겠습니다.

클라이언트 인증확인을 위해 외부 인증확인 도구 사용

사용자 정의 토큰을 만드는 주된 용도는 LDAP 서버와 같이 사용자가 제어하는 외부/레거시 인증 메커니즘에 대해 사용자가 인증할 수 있도록 하는 것입니다.이를 위한 기본 프로세스는 iOS, Android, 입니다.

기본적으로 서비스는 JWT 토큰을 주조하여 고객에게 전달합니다.클라이언트는 사용자가 제공한 사용자 지정 토큰을 사용하여 확인/인증을 수행합니다.

권한 있는 작업자 인증

더 이상 사용자 정의 토큰을 사용하여 서버 프로세스를 인증할 필요가 없습니다. 작업은 서버에 Firebase 추가에서 단계별로 다루는 서비스 계정을 생성하여 수행됩니다.완료되면 개인 키가 포함된 JSON 파일이 표시됩니다.

다음 계정 증명을 합니다. JSON을 사용합니다.serviceAccount을 입력합니다.firebase.initializeApp()그리고 당신이 들어갑니다!이는 여기에 설명되어 있으며 다음과 같습니다(Java 버전은 링크 참조).

var firebase = require("firebase");

// Initialize the app with a service account, granting admin privileges
firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "./serviceAccountCredentials.json"
});

서버 프로세스에서 사용자 에뮬레이트 또는 접근 제한

사용자를 에뮬레이트하거나 서버 프로세스에서 액세스를 제한(권장)하는 것은 매우 간단합니다.더 이상 사용자 지정 토큰을 만들 필요가 없습니다.

이 작업은 다음을 추가하기만 하면 됩니다.databaseAuthVariableOverride에 대한 당신의 요청에 따라.database.initializeApp():

firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "./serviceAccountCredentials.json",
  databaseAuthVariableOverride: {
    uid: "my-service-worker-or-user-uid"
  }
});

보안을 통해 클라이언트 ID 확인

먼저, Firebase 데이터베이스를 사용하는 경우 클라이언트가 데이터베이스에 기록하도록 하고 보안 규칙을 사용하여 ID를 확인함으로써 서버 측 확인 작업을 피할 수 있습니다.서버가 쓰기 위해 인증확인이 필요한 경로를 수신하는 경우, 서버에서 특별한 보안 없이 이미 해결되었습니다.

이를 이벤트 대기열로 모델링하여 단순하고 모듈식이며 확장 가능한 서버 작업자 전략을 작성합니다.Node.js 도구에 대한 자세한 내용은 firebase-queue를 참조하십시오.3.x를 지원합니다.

서버에서 클라이언트 ID 토큰 확인

호출토큰을 Realtime Database를 할 수 .verifyIdToken()여기에 기술된 바와 같이이는 다음과 같습니다.

auth.verifyIdToken(idToken).then(function(decodedToken) {
  var uid = decodedToken.sub;
});

그런 다음 해당 사용자로 인증하여 데이터베이스에 쓰고 보안을 적용하려면 위의 사용자 에뮬레이션 섹션을 사용합니다.다시 말해서, 콜initializeApp()databaseAuthVariableOverride적절한 UID로 설정합니다.

참고로, 만약 당신이 전화를 하려고 한다면,initializeApp()Error: Firebase App named '[DEFAULT]' already exists.: initializeApp() 호출에 두앱할 수 .database.initializeApp({...}, 'asUser'+uid))을 앱 firebase.database('asUser'+uid).ref(...).여러 앱 인스턴스 사용에 대한 자세한 내용은 여기를 참조하십시오.

위 링크에서 Java 코드를 사용할 수 있습니다.Go 및 기타 타사 솔루션은 아래에서 다룹니다.

REST API에서 사용할 토큰 생성

마이클 블레이는 여기서 이 시나리오를 다루었고 이것을 해결한 것에 대해 약간의 평판을 받을 자격이 있습니다.

토큰 생성 또는 REST를 통해 확인

지원되지 않습니다.미안하다.

골랑 등: 앞으로 더 많이

우리는 바둑 토큰 주조 및 검증 라이브러리를 개발하고 있습니다.이를 위한 Python 툴도 곧 추가할 예정입니다.이것에 대한 발매일이나 야구장은 없습니다.한편, 공식 Firebase Node.js 또는 Java 라이브러리(기본 제공 확인 방법 있음)를 사용하지 않고 클라이언트 ID 토큰을 확인하려면 ID 토큰(JWT)이 다음을 준수하는지 확인해야 합니다.

  • 디코딩된 헤더는 다음과 같습니다.alg와 동등한 청구권"RS256".
  • 디코딩된 페이로드는 다음과 같습니다.aud(청중) 요청은 Firebase 프로젝트 ID와 동일합니다.
  • 디코딩된 페이로드는 다음과 같습니다.iss와 동등한 청구권"https://securetoken.google.com/<projectId>".
  • 디코딩된 페이로드에 비어 있지 않은 문자열이 있습니다.sub청구권참고로 이것은uid사용할 수 있습니다.
  • 디코딩된 헤더는 다음과 같습니다.kid(키 ID) 다음에 나열된 공개 키 중 하나에 해당하는 클레임https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com.
  • 또한 JWT 라이브러리를 사용하여 공개 키로 토큰을 확인하여 공개 키의 해당 개인 키로 토큰이 서명되었는지 확인해야 합니다.

Go의 경우 클라이언트 ID 토큰을 디코딩하고 유효성을 검사하는 데 사용할 수 있습니다.

글쎄요, 소방 기지는 다음과 같은 것을 확인할 수 없습니다.custom tokens그들이 하는 일은 검증을 허용하는 것입니다.id tokens사용자가 사용자 지정 토큰을 사용하여 로그인하면 생성됩니다.저와 마찬가지로, Firebase 사용자 지정 토큰을 다른 서비스에 전달하여 백엔드로 인증하면 사용자 지정 토큰 검증이 수행됩니다.또한 구글 서비스 계정.X509 cert올바른 형식이 아닙니다.이것들이 있습니다.\n (new line)텍스트 편집기에서 새 줄로 대체되지 않는 구분 기호(사용)vim그래서 제가 한 일은 다음과 같습니다.

  val factory = CertificateFactory.getInstance("X.509")
  val certificateFile = this.getClass.getResourceAsStream(Play.current.configuration.getString("firebase.certificate").get)
  val publicKey = factory.generateCertificate(certificateFile).asInstanceOf[X509Certificate].getPublicKey
  val claimBody = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(compactJws).getBody
  1. 파이어베이스를 설정하는 동안 다운로드한 json에 지정된 Google 서비스 계정 링크에서 인증서 가져오기
  2. 수동으로 바꾸기\n새로운 노선으로
  3. JWT 라이브러리를 가져옵니다.이 훌륭한 라이브러리를 사용하여 Java JWT를 검증했습니다.
  4. 인증서를 읽고 공용 키를 추출합니다.
  5. 공개 키를 사용하여 토큰 확인
  6. 토큰이 한 시간 동안만 유효하므로 토큰을 새로 고칠 다른 API가 있는지 확인하십시오.

도움이 되길 바랍니다!

언급URL : https://stackoverflow.com/questions/37408684/is-it-still-possible-to-do-server-side-verification-of-tokens-in-firebase-3

반응형