programing

파이어베이스로 여러 소셜 서비스로 로그인하려면 어떻게 해야 합니까?

starjava 2023. 6. 26. 20:46
반응형

파이어베이스로 여러 소셜 서비스로 로그인하려면 어떻게 해야 합니까?

사용자가 Facebook, Twitter 또는 Github과 같은 여러 인증 공급자를 사용하여 내 Firebase 응용프로그램에 대해 인증할 수 있기를 원합니다.인증이 완료되면 사용자가 어떤 인증 방법을 사용했든 상관없이 동일한 계정에 액세스할 수 있도록 합니다.

즉, 여러 인증 방법을 앱 내의 단일 계정으로 병합하고 싶습니다.파이어베이스 앱에서 어떻게 해야 합니까?


업데이트(20160521):Firebase는 Firebase Authentication 제품의 주요 업데이트를 발표했습니다. 이제 단일 사용자가 다양한 지원 공급자의 계정을 연결할 수 있습니다. 이 기능에 대한 자세한 내용은 iOS, Android용 설명서를 참조하십시오. 아래 답변은 역사적인 이유로 남겨졌습니다.


핵심 Firebase 서비스는 다음과 같은 몇 가지 인증 방법을 제공합니다. https://www.firebase.com/docs/security/authentication.html

핵심적으로 Firebase는 인증에 보안 JWT 토큰을 사용합니다.사용자의 서버에서 JWT 라이브러리를 사용하는 것과 같이 JWT 토큰을 생성하는 모든 것은 사용자를 Firebase에 인증하기 위해 작동하므로 사용자는 인증 프로세스를 완전히 제어할 수 있습니다.

Firebase는 이러한 토큰을 생성하는 한 가지 방법인 Firebase Simple Login이라는 서비스를 제공합니다(이것은 Facebook, Twitter 등의 인증을 제공합니다).일반적인 인증 시나리오를 위한 것이므로 서버 없이 신속하게 실행할 수 있습니다. 그러나 인증을 위한 유일한 방법은 아니며 포괄적인 솔루션도 아닙니다.

다음은 Firebase Simple Login을 사용하여 여러 공급자와의 로그인을 허용하는 한 가지 방법입니다.

  1. 각 사용자에 대해 하나의 표준 사용자 식별자와 각 공급자별 식별자에 대한 매핑을 해당 하나의 표준 ID에 저장합니다.
  2. 보안 규칙을 업데이트하여 지정된 사용자 계정의 자격 증명과 일치하도록 합니다.

실제로 Twitter 및 Facebook 인증을 모두 활성화하거나 사용자가 하나의 계정을 만든 다음 나중에 다른 계정을 추가할 수 있도록 허용하는 경우 보안 규칙은 다음과 같이 나타날 수 있습니다.

{
  "users": {
    "$userid": {
      // Require the user to be logged in, and make sure their current credentials
      // match at least one of the credentials listed below, unless we're creating
      // a new account from scratch.
      ".write": "auth != null && 
        (data.val() === null || 
        (auth.provider === 'facebook' && auth.id === data.child('facebook/id').val() || 
        (auth.provider === 'twitter' && auth.id === data.child('twitter/id').val()))"
    }
  },
  "user-mappings": {
    // Only allow users to read the user id mapping for their own account.
    "facebook": {
      "$fbuid": {
        ".read": "auth != null && auth.provider === 'facebook' && auth.id === $fbuid",
        ".write": "auth != null && 
          (data.val() == null || 
          root.child('users').child(data.val()).child('facebook-id').val() == auth.id)"
      }
    },
    "twitter": {
      "$twuid": {
        ".read": "auth != null && auth.provider === 'twitter' && auth.id === $twuid",
        ".write": "auth != null && 
          (data.val() == null || 
          root.child('users').child(data.val()).child('twitter-id').val() == auth.id)"
      }
    }
  }
}

이 예에서는 하나의 글로벌 사용자 ID(선택할 수 있는 모든 사용자)를 저장하고 Facebook, Twitter 등의 인증 메커니즘과 기본 사용자 레코드 간의 매핑을 유지합니다.각 사용자에 대해 로그인하면 사용자 매핑에서 기본 사용자 레코드를 가져와 해당 ID를 사용자 데이터 및 작업의 기본 저장소로 사용합니다.또한 위는 /users/$userid/(facebook-id|twitter-id|etc-id)에서 이미 동일한 Facebook, Twitter 등의 사용자 ID를 가진 적절한 사용자만 데이터를 쓸 수 있도록 사용자 매핑의 데이터를 제한하고 검증합니다.

이 방법을 사용하면 빠르게 시작하고 실행할 수 있습니다.그러나 복잡한 사용 사례가 있고 인증 환경을 완벽하게 제어하려면 자신의 서버에서 자체 인증 코드를 실행할 수 있습니다.모든 인증 및 여권과 같이 이 작업에 사용할 수 있는 많은 유용한 오픈 소스 라이브러리가 있습니다.

타사 인증 공급자를 사용하여 인증할 수도 있습니다.예를 들어, 서버 측 코드를 작성할 필요 없이 바로 사용할 수 있는 매우 다양한 통합 기능이 있는 Single을 사용할 수 있습니다.

저는 이 게시물이 몇 달 동안 존재한다는 것을 알고 있지만, 제가 이 문제에 직면했을 때, 코드를 더 유연하게 만드는 데 많은 시간이 걸렸습니다.위의 앤드류 코드를 기준으로 코드를 조금 수정했습니다.

표본 데이터 저장소:

userMappings
|---facebook:777
|   |---user:"123"
|---twitter:888
    |---user:"123"
users
|---123
    |---userMappings
        |---facebook: "facebook:777"
        |---twitter: "twitter:888"

보안 규칙:

"userMappings": {
  "$login_id": {
    ".read": "$login_id === auth.uid",
    ".write": "auth!== null && (data.val() === null || $login_id === auth.uid)"
  }
},

"users": {
  "$user_id": {
    ".read": "data.child('userMappings/'+auth.provider).val()===auth.uid",
    ".write": "auth!= null && (data.val() === null || data.child('userMappings/'+auth.provider).val()===auth.uid)"
  }
}

따라서 userMappings는 여전히 Facebook, Twitter로 로그인할 때 가장 먼저 검색하는 정보입니다.userMappings의 사용자가 사용자의 기본 계정을 가리킵니다.그래서 페이스북이나 트위터 로그인 후에 메인 사용자 계정을 조회할 수 있습니다.사용자의 경우 데이터에 액세스할 수 있는 userMapping 목록을 보관합니다.

새로운 사용자를 생성할 때, 우리는 먼저 사용자에게 계정을 생성해야 합니다.사용자의 사용자 ID는 우리가 원하는 모든 것이 될 수 있습니다.이는 보안 규칙을 추가하지 않고도 Google, Github과 같은 로그인 방법을 더 많이 제공할 수 있기 때문에 유연합니다.

저는 우리를 위해 이것을 처리하기 위해 각진 불 장식가를 만들었습니다: 각진 불-멀티-auth.

저는 좋은 해결책을 생각하는 데 꽤 많은 시간을 소비했는데, IMHO가 어떤 공급자로부터든 등록할 수 있다는 것은 그저 혼란스러울 뿐입니다.프론트엔드에서 저는 항상 이메일 등록을 요청하기 때문에 예를 들어 페이스북과 구글+로 로그인하는 사용자는 이메일을 알릴 때 동일한 사용자로 기록됩니다.

이렇게 하면 Kuma가 제안한 샘플 데이터는 userMappings를 복제할 필요가 없습니다.

표본 데이터 저장소:

userMappings
|---facebook:777
|   |---user:"123"
|---twitter:888
    |---user:"123"
users
|---123
    |---user data

언급URL : https://stackoverflow.com/questions/15148089/how-can-i-login-with-multiple-social-services-with-firebase

반응형