2017-02-07 6 views
1

Firebase 앱을 지원하는 Android 앱을 만들고 있는데, 다른 사용자 계정을 수정하거나 삭제할 수있는 Admin 계정을 만들고 싶습니다. 올바르게 이해했다면, Firebase Admin SDK가 이것을 허용해야합니다. 그래서 나는 지침 here을 따라 갔다.Android 용 Firebase Admin SDK, 메소드를 찾을 수 없습니다.

내 앱에서 Admin SDK를 설정하려면. 나는 build.app에 다음과 같은 추가 :

  • 가있는 방법이 없습니다 :

    FileInputStream serviceAccount = null; 
    try { 
        serviceAccount = new FileInputStream("app/<MY-DATABASE>.json"); 
    } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
    } 
    
    if (serviceAccount != null) { 
        FirebaseOptions options = new FirebaseOptions.Builder() 
          .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
          .setDatabaseUrl("https://<MY-APP>.firebaseio.com/") 
          .build(); 
    
        FirebaseApp.initializeApp(options); 
    } 
    

    그러나, 그 날 말하고 :

    compile 'com.google.firebase:firebase-admin:4.1.1' 
    

    그리고 내 응용 프로그램 클래스,이 추가 FirebaseOptions.Builder의 setCredential() 및

  • FirebaseApp.initializeApp()는 FirebaseOptions가 아닌 Context 객체를 사용합니다.

문서에 따르면 FirebaseOptions.Builder.setCredential()은 더 이상 사용되지 않는 FirebaseOptions.Builder.setServiceAccount()을 대체하는 새로운 방법입니다. 그러나 setServiceAccount()도 존재하지 않습니다.

여기 무슨 일 이니?

+3

Firebase Admin SDK는 신뢰할 수있는 장치 (예 : 사용자가 제어하는 ​​서버)에서만 사용됩니다. Firebase Admin SDK를 일반 사용자에게도 보내는 Android 앱에 포함 시키면 모든 사용자가 Firebase 프로젝트 전체에 액세스 할 수 있습니다. 권장하지 않습니다. –

+0

프랭크의 대답이 중요한 것입니다. 그러나 컴파일 오류를 설명하기 위해서는 패키지가 [Client SDK 패키지] (https://firebase.google.com/docs/reference/android/com/google/firebase/FirebaseOptions.Builder)를 [ 관리 (서버) SDK 패키지] (https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/FirebaseOptions.Builder). –

답변

3

Firebase Android 클라이언트 라이브러리와 함께 Android 앱에서 Firebase Admin SDK를 사용할 수 없습니다. SDK는 모두 동일한 패키지와 클래스 이름을 가진 클래스를 제공하므로 둘 다 동시에 사용할 수는 없습니다 (컴파일러가 어떤 것을 응용 프로그램에 빌드 할 것인지 어떻게 알 수 있습니까?).

는 예를 들어, 안드로이드 클라이언트 라이브러리에서 FirebaseOptions 빌더를위한 Javadoc을 살펴 걸릴 :

com.google.firebase.FirebaseOptions.Builder

지금 자바 관리 SDK에서 같은 클래스보고를 (URL이 다른주의) :

com.google.firebase.FirebaseOptions.Builder

당신은 이름이 같은 경우에도 서로 다른 일을 걸 직접 확인할 수 있습니다. 따라서 컴파일러는 Android SDK 정의를보고 관리 SDK 정의는 검토하지 않습니다.

Frank는 Android 앱에서 관리 라이브러리를 사용하고 싶지 않다고 말했습니다. Admin SDK를 사용하려면 제어하는 ​​서버에서 사용하고 필요에 따라 Android 앱과 통신하십시오.

+0

하지만 .setCredentials (GoogleCredentials.fromStream (serviceAccount)) 메소드는 Firebase Admin SDK에서만 사용 가능합니다. Studio가 항상 다른 종속성에서 FirebaseOptions 클래스를 가져 가기 때문에이 방법을 사용할 수있는 방법이 있다는 것을 말씀해 주시겠습니까? –

0

허용되는 답변에 따르면 Firebase를 사용하는 Android 앱에 Firebase Admin을 설치하는 것은 좋지 않습니다. 동일한 이름을 가진 클래스가 있기 때문입니다.

나는 사용자 정의 토큰 ( https://firebase.google.com/docs/auth/android/custom-auth)를 창조하고 싶었다, 그래서 나는 일을 결국 :

1) 별도의 UI가없는 서버 응용 프로그램을 만듭니다.

class MainActivity : AppCompatActivity() { 
    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     finish() // Just end the app here. 
    } 
} 

<resources> 
    <style name="AppTheme" parent="@android:style/Theme.NoDisplay"> 
    </style> 
</resources> 

2) 서버 응용 프로그램에 IntentService를 추가하고 사용자 정의 토큰을 생성하십시오.

class CustomTokenService : IntentService(CustomTokenService::class.java.simpleName) { 
    // Runs in its own thread. 
    override fun onHandleIntent(intent: Intent?) {  
     // Initialize FirebaseApp only when not already initialized. 
     try { 
      FirebaseApp.getInstance() 
     } catch (ex: IllegalStateException) { 
      try { 
       val inputStream = assets.open("serviceAccountKey.json") 
       val options = FirebaseOptions.Builder(). 
         setCredential(FirebaseCredentials.fromCertificate(inputStream)). 
         setDatabaseUrl("https://YOUR_APP.firebaseio.com/"). 
         build() 
       FirebaseApp.initializeApp(options) 
       inputStream.close() 
      } catch (e: IOException) { 
       e.printStackTrace() 
      } 
     } 

     // In real life, you should verify ID/PW before creating custom token. 
     val id = intent!!.getStringExtra("ID") 
     val pw = intent.getStringExtra("PW") 

     val additionalClaims = HashMap<String, Any>() 
     additionalClaims.put("premiumAccount", true) 

     FirebaseAuth.getInstance().createCustomToken(id, additionalClaims). 
       addOnSuccessListener { customToken -> 
      // Send custom token back to client. 
      val resultReceiver = intent.getParcelableExtra<ResultReceiver>(RESULT_RECEIVER) 
      val bundle = Bundle() 
      bundle.putString(CUSTOM_TOKEN, customToken) 
      resultReceiver.send(Activity.RESULT_OK, bundle) 
     } 
    } 
} 

나는 "ResultReceiver"를 통해 토큰을 클라이언트로 다시 지정을 보내고있다 참고,하지만 당신은 "메신저"또는 "브로드 캐스트 리시버"등의 다른 방법을 자유롭게 사용할 수 있습니다.

3) 클라이언트에서 서버 앱에있는 서비스를 시작합니다.

String MYSERVER = "SERVER_ID"; // e.g. "com.domain.myserver" 
String CUSTOM_TOKEN_SERVICE = MYSERVER + ".CustomTokenService"; 

Intent intent = new Intent(); 
intent.putExtra("ID", ID); 
intent.putExtra("PW", PW); 
intent.putExtra(RESULT_RECEIVER, mResultReceiver); 
intent.setComponent(new ComponentName(MYSERVER, CUSTOM_TOKEN_SERVICE)); 
getContext().startService(intent); 

4) 서버 응용 프로그램에서 사용자 지정 토큰을 받으면 Firebase에 로그인합니다.

ResultReceiver resultReceiver = new ResultReceiver(new Handler()) { 
    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     String customToken = resultData.getString(CUSTOM_TOKEN); 
     mFirebaseAuth.signInWithCustomToken(customToken); 
    } 
}; 
Parcel parcel = Parcel.obtain(); 
resultReceiver.writeToParcel(parcel, 0); 
parcel.setDataPosition(0); 
mResultReceiver = ResultReceiver.CREATOR.createFromParcel(parcel); 
parcel.recycle(); 

5) 그리고 Gradle 구성 파일.

buildscript { 
    ext.kotlin_version = '1.2.21' 
    repositories { 
     google() 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:3.0.1' 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     google() 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

--------------------------------------------------------------------------- 
apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 

android { 
    compileSdkVersion 26 

    defaultConfig { 
     applicationId "org.solamour.myserver" 
     minSdkVersion 14 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     multiDexEnabled true 

     javaCompileOptions { 
      annotationProcessorOptions { 
       includeCompileClasspath false 
      } 
     } 
     resConfigs "auto" 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    // Conflict with dependency 'com.google.code.findbugs:jsr305' in project ':app'. 
    // Resolved versions for app (1.3.9) and test app (2.0.1) differ. 
    configurations.all { 
     resolutionStrategy.force 'com.google.code.findbugs:jsr305:2.0.1' // Or "1.3.9". 
    } 
} 

dependencies { 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
    implementation 'com.android.support:appcompat-v7:26.1.0' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 

    implementation 'com.google.firebase:firebase-admin:4.1.6' 
    implementation 'com.android.support:multidex:1.0.2' 
} 

내가 사용할 수 있었던 가장 높은 Firebase Admin 버전은 "4.1.6"이었습니다. 그 이후의 모든 것은 gradle 파일에 대한 많은 수정을 필요로합니다.

+0

당신의 제안을 구현하려했지만 여전히 "setCredentials를 인식하지 못했습니다"... 당신의 gradle 파일을 공유 할 수 있습니까? –

1

이제 다른 종속성에서 가져온 FirebaseOptions 클래스는 exclude 태그를 사용하여 아래와 같이 firebase 구성 요소를 다른 종속성에서 제거 할 수 있습니다.

compile 'com.google.firebase:firebase-admin:5.8.0' 

compile ('com.google.firebase:firebase-messaging:9.6.1'){ 
    exclude module: 'firebase-common' 
} 
compile ('com.google.firebase:firebase-auth:9.6.1'){ 
    exclude module: 'firebase-common' 
} 
compile ('com.google.firebase:firebase-database:9.6.1'){ 
    exclude module: 'firebase-common' 
} 
compile ('com.firebase:firebase-client-android:2.5.0'){ 
    exclude module: 'firebase-common' 
} 
관련 문제