在 Android 上使用 GitHub 進行身份驗證

您可以使用 Firebase SDK 將基於網絡的通用 OAuth 登錄集成到您的應用中,以執行端到端的登錄流程,從而讓您的用戶使用他們的 GitHub 帳戶通過 Firebase 進行身份驗證。

在你開始之前

要使用 GitHub 帳戶登錄用戶,您必須首先啟用 GitHub 作為 Firebase 項目的登錄提供程序:

  1. 如果你還沒有,添加火力地堡到您的Android項目

  2. 火力地堡控制台,打開驗證部分。
  3. 登錄方法選項卡,選中GitHub的供應商。
  4. 添加來自供應商的開發者控制台提供者配置的客戶端ID客戶端密鑰
    1. 註冊您的應用程序作為在GitHub上開發的應用程序,讓你的應用程序的OAuth 2.0客戶端ID客戶端密鑰
    2. 確保你的火力地堡的OAuth重定向URI(my-app-12345.firebaseapp.com/__/auth/handler )設置為你的應用程序的設置頁面的授權回調網址,您的GitHub上的應用程序的配置
  5. 單擊保存
  6. 使用火力地堡Android的物料清單,聲明你的模塊(應用程序級)搖籃文件(通常為火力地堡認證的Android庫的依賴app/build.gradle )。

    爪哇

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.1')
    
        // Declare the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth'
    }
    

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    dependencies {
        // Declare the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth:21.0.1'
    }
    

    科特林+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.1')
    
        // Declare the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx'
    }
    

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    dependencies {
        // Declare the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx:21.0.1'
    }
    

  7. 如果您還沒有指定您的應用程序的SHA-1指紋,從這樣做設置頁面的火力地堡控制台。請參閱驗證您的客戶,了解如何讓你的應用程序的SHA-1指紋細節。

使用 Firebase SDK 處理登錄流程

如果您正在構建 Android 應用程序,使用 Firebase 的 GitHub 帳戶對您的用戶進行身份驗證的最簡單方法是使用 Firebase Android SDK 處理整個登錄流程。

要使用 Firebase Android SDK 處理登錄流程,請按以下步驟操作:

  1. 構造一個使用它的建造者與提供者ID的OAuthProvider的實例github.com

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
    
  2. 可選:指定其他定制的OAuth參數要使用OAuth發送請求。

    // Target specific email with login hint.
    provider.addCustomParameter("login", "your-email@gmail.com");
    

    對於GitHub的支持參數,請參見GitHub的OAuth的文檔。請注意,您不能通過火力地堡,需要的參數與setCustomParameters()這些參數是CLIENT_ID,RESPONSE_TYPE,REDIRECT_URI,狀態範圍response_mode。

  3. 可選:指定其他的OAuth超越了基本的輪廓2.0範圍要由身份驗證提供者的要求。如果您的應用程序需要訪問從GitHub API的私人用戶數據,則需要請求訪問權限的GitHub的API的下GitHub的開發者控制台API權限。請求的 OAuth 範圍必須與應用的 API 權限中的預配置範圍完全匹配。

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    List<String> scopes =
        new ArrayList<String>() {
          {
            add("user:email");
          }
        };
    provider.setScopes(scopes);
    
  4. 使用 OAuth 提供程序對象通過 Firebase 進行身份驗證。請注意,不像其他FirebaseAuth操作,這將彈出一個把你的UI控制自Chrome標籤。其結果是,不引用在你的活動OnSuccessListenerOnFailureListener你附加為當操作啟動UI他們會立即取下。

    您應該首先檢查您是否已經收到回复。通過此方法登錄會將您的 Activity 置於後台,這意味著它可以在登錄流程中被系統回收。如果發生這種情況,為了確保您不會讓用戶再次嘗試,您應該檢查結果是否已經存在。

    要檢查是否存在未決的結果,請致電getPendingAuthResult

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
      // There's something already here! Finish the sign-in for your user.
      pendingResultTask
          .addOnSuccessListener(
              new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                  // User is signed in.
                  // IdP data available in
                  // authResult.getAdditionalUserInfo().getProfile().
                  // The OAuth access token can also be retrieved:
                  // authResult.getCredential().getAccessToken().
                }
              })
          .addOnFailureListener(
              new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                  // Handle failure.
                }
              });
    } else {
      // There's no pending result so you need to start the sign-in flow.
      // See below.
    }
    

    要開始流動的跡象,請致電startActivityForSignInWithProvider

    firebaseAuth
        .startActivityForSignInWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

    成功完成後,令牌與提供商相關聯的OAuth訪問可以從檢索OAuthCredential對象返回。

    使用OAuth訪問令牌,你可以調用GitHub的API

    例如,為了獲得基本的個人資料信息,你可以調用REST API,通過令牌中的訪問Authorization頭:

  5. 雖然上述實施例集中於登錄流,還具有到GitHub的提供者鏈接到使用現有的用戶的能力startActivityForLinkWithProvider 。例如,您可以將多個提供商鏈接到同一用戶,允許他們使用任一提供商登錄。

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // GitHub credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
    
  6. 同樣的模式可以被用來startActivityForReauthenticateWithProvider可用於檢索需要登錄近期敏感操作的新鮮憑證。

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is re-authenticated with fresh tokens and
                // should be able to perform sensitive operations
                // like account deletion and email or password
                // update.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

下一步

用戶首次登錄後,將創建一個新用戶帳戶並將其鏈接到用戶登錄時使用的憑據(即用戶名和密碼、電話號碼或身份驗證提供商信息)。這個新帳戶作為 Firebase 項目的一部分存儲,可用於識別項目中每個應用中的用戶,無論用戶如何登錄。

  • 在您的應用程序,你可以從用戶的基本資料信息FirebaseUser對象。請參閱管理用戶

  • 在你的火力地堡實時數據庫和雲存儲安全規則,你可以得到簽署的,從用戶的唯一的用戶ID auth的變量,並用它來控制哪些數據的用戶可以訪問。

您可以允許用戶通過使用多個身份驗證提供登錄到您的應用程序連接身份驗證提供憑據到現有的用戶帳戶。

要註銷用戶,請撥打signOut

爪哇

FirebaseAuth.getInstance().signOut();

科特林+KTX

Firebase.auth.signOut()