安卓基于 FirebaseAuth 实现 google 登录

安卓基于 FirebaseAuth 实现 google 登录

文章目录

  • 安卓基于 FirebaseAuth 实现 google 登录
    • 1. 前期准备
      • 1.1 创建 Firebase 项目
      • 1.2 将 Android 应用连接到 Firebase
      • 1.3 在 Firebase 控制台中启用 Google 登录
    • 2. 在 Android 应用中实现 Google 登录
      • 2.1 初始化 GoogleSignInClient
      • 2.2 启动 Google 登录流程
      • 2.3 处理登录结果
      • 2.4 处理用户状态变化(可选但推荐)
      • 2.5 退出登录
    • 3. 注意事项和最佳实践

本文首发地址 https://h89.cn/archives/414.html

在 Android 应用中基于 Firebase Authentication 实现 Google 登录是一个非常常见的需求,因为它简化了用户认证流程,并利用了 Google 强大的身份验证基础设施。下面我将详细介绍整个实现过程。


1. 前期准备

1.1 创建 Firebase 项目

  1. 访问 Firebase 控制台: 访问 Firebase Console。
  2. 创建新项目或选择现有项目: 如果你还没有 Firebase 项目,点击“添加项目”并按照向导创建。如果你已有项目,选择它。

1.2 将 Android 应用连接到 Firebase

  1. 在 Firebase 控制台的项目概览页面,点击 “将应用添加到 Firebase”,然后选择 “Android” 图标。

  2. 输入 Android 包名: 输入你的 Android 应用的包名(例如:com.yourcompany.yourapp)。这个包名必须与你 build.gradle 文件中的 applicationId 一致。

  3. 输入 SHA-1 密钥: SHA-1 指纹用于验证你的应用与 Firebase 项目的关联。

    • 获取 SHA-1: 在 Android Studio 中,打开 Gradle 面板(通常在右侧),展开你的项目 -> Tasks -> android,双击 signingReport。你会在 Run 窗口中看到 SHA-1 指纹。
    • 将 SHA-1 复制并粘贴到 Firebase 控制台。
  4. 下载 google-services.json 文件: 按照 Firebase 控制台的指示下载 google-services.json 文件,并将其放置到你的 Android 项目的 app/ 目录下。

  5. 添加 Firebase SDK: 按照指示在你的 build.gradle 文件中添加必要的 Firebase SDK 依赖项。

    • 项目级别的 build.gradle (<project>/build.gradle):

      buildscript {repositories {google()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:8.x.x' // 根据你的Android Studio版本调整classpath 'com.google.gms:google-services:4.x.x' // 最新版本}
      }allprojects {repositories {google()mavenCentral()}
      }
      
    • 应用级别的 build.gradle (<project>/app/build.gradle):

      plugins {id 'com.android.application'id 'com.google.gms.google-services' // 添加这一行
      }android {// ...
      }dependencies {// ...implementation(platform("com.google.firebase:firebase-bom:33.x.x")) // 最新版本implementation("com.google.firebase:firebase-auth")implementation("com.google.android.gms:play-services-auth:21.x.x") // Google Sign-In SDK
      }
      
    • 同步项目: 修改完 build.gradle 文件后,同步你的 Android 项目。

1.3 在 Firebase 控制台中启用 Google 登录

  1. 在 Firebase 控制台,点击左侧菜单的 “Authentication”
  2. 选择 “Sign-in method” 标签页。
  3. 找到 “Google” 提供商,点击它。
  4. 启用 Google 登录,然后点击 “保存”
    • 重要提示: 在这里,你需要确保已经有一个“Web 客户端(Web application)”类型的 OAuth 2.0 客户端 ID。Firebase 会自动为你的项目生成一个,但如果你在 Google Cloud Console 中手动创建过项目,可能需要检查。这个 Web 客户端 ID 是用于后端服务器与 Google 认证服务通信的,不是你的 Android 客户端 ID。

2. 在 Android 应用中实现 Google 登录

2.1 初始化 GoogleSignInClient

在你的 Activity 或 Fragment 中,首先需要初始化 GoogleSignInClient 对象。这个对象用于启动 Google 登录流程。

// Kotlin
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.firebase.auth.FirebaseAuthclass MainActivity : AppCompatActivity() {private lateinit var googleSignInClient: GoogleSignInClientprivate lateinit var firebaseAuth: FirebaseAuthoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 配置 Google Sign In 以请求用户的 ID、电子邮件地址以及 ID 令牌val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(R.string.default_web_client_id)) // 这里很重要,需要 Web 客户端 ID.requestEmail().build()googleSignInClient = GoogleSignIn.getClient(this, gso)firebaseAuth = FirebaseAuth.getInstance()// ... 其他初始化代码}
}

关于 default_web_client_id
这个 ID 可以在 google-services.json 文件中找到,它通常位于 client 数组中,client_type 为 3 的对象的 oauth_client 数组下的 client_id。或者,你也可以在 Firebase 控制台的 项目设置 -> 通用 页面中找到它(通常以 .apps.googleusercontent.com 结尾)。在 strings.xml 中定义它:

<resources><string name="default_web_client_id" translatable="false">YOUR_WEB_CLIENT_ID_FROM_FIREBASE</string>
</resources>

关于requestIdToken
如果去掉 requestIdToken ,可以实现通过 Google 登录
需要在 https://console.cloud.google.com 添加账户配置,不需要 Firebase 平台,

2.2 启动 Google 登录流程

通常,你会通过一个按钮(例如“使用 Google 登录”按钮)来触发登录流程。

// Kotlin
// 在你的 onCreate 或其他适当位置为按钮设置点击监听器
signInButton.setOnClickListener {signInWithGoogle()
}private fun signInWithGoogle() {val signInIntent = googleSignInClient.signInIntentstartActivityForResult(signInIntent, RC_SIGN_IN) // RC_SIGN_IN 是你定义的请求码
}companion object {private const val RC_SIGN_IN = 9001 // 请求码,任意整数即可
}

2.3 处理登录结果

onActivityResult 方法中,你需要处理 Google 登录的结果,并将其传递给 Firebase Authentication。

// Kotlin
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.common.api.ApiException
import com.google.firebase.auth.GoogleAuthProvideroverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)// 检查请求码是否是 Google Sign-In 的请求码if (requestCode == RC_SIGN_IN) {val task = GoogleSignIn.getSignedInAccountFromIntent(data)try {// Google Sign In 成功,现在使用 Google 账户向 Firebase 验证val account = task.getResult(ApiException::class.java)Log.d(TAG, "Google sign-in successful: account.idToken=${account.idToken}")firebaseAuthWithGoogle(account.idToken!!)} catch (e: ApiException) {// Google Sign In 失败,更新 UI 或显示错误信息Log.w(TAG, "Google sign-in failed", e)Toast.makeText(this, "Google 登录失败:${e.message}", Toast.LENGTH_SHORT).show()}}
}private fun firebaseAuthWithGoogle(idToken: String) {Log.d(TAG, "firebaseAuthWithGoogle:$idToken")val credential = GoogleAuthProvider.getCredential(idToken, null)firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this) { task ->if (task.isSuccessful) {// 登录成功Log.d(TAG, "Firebase Google 登录成功")val user = firebaseAuth.currentUserupdateUI(user) // 更新 UI,例如跳转到主页} else {// 登录失败Log.w(TAG, "Firebase Google 登录失败", task.exception)Toast.makeText(this, "Firebase Google 登录失败:${task.exception?.message}", Toast.LENGTH_SHORT).show()updateUI(null)}}
}private fun updateUI(user: FirebaseUser?) {if (user != null) {// 用户已登录,可以跳转到主页Toast.makeText(this, "欢迎, ${user.displayName ?: user.email}", Toast.LENGTH_SHORT).show()// 例如:startActivity(Intent(this, HomeActivity::class.java))// finish()} else {// 用户未登录,保持在登录界面Toast.makeText(this, "请登录", Toast.LENGTH_SHORT).show()}
}

2.4 处理用户状态变化(可选但推荐)

你可以在 Activity 的 onStart() 方法中检查用户是否已登录。

// Kotlin
import com.google.firebase.auth.FirebaseUseroverride fun onStart() {super.onStart()// 检查用户是否已登录 (非空) 并更新 UIval currentUser = firebaseAuth.currentUserupdateUI(currentUser)
}

2.5 退出登录

// Kotlin
private fun signOut() {firebaseAuth.signOut() // Firebase 退出登录googleSignInClient.signOut().addOnCompleteListener(this) {// Google 退出登录成功updateUI(null)Toast.makeText(this, "已退出登录", Toast.LENGTH_SHORT).show()}
}

3. 注意事项和最佳实践

  • 错误处理: 在实际应用中,你需要对 ApiExceptionaddOnCompleteListener 中的 task.exception 进行更详细的错误处理,向用户提供有用的反馈。
  • UI 更新: updateUI() 方法是一个占位符,你需要根据你的应用逻辑来实现它。例如,当用户登录成功时,你可以导航到主屏幕;当用户注销时,可以返回登录屏幕。
  • 安全性:
    • SHA-1 指纹: 确保你提供给 Firebase 的 SHA-1 指纹是正确的。如果你使用了发布版签名,你还需要为发布版签名配置一个 SHA-1 指纹。
    • default_web_client_id 确保你使用了正确的 Web 客户端 ID。
    • 混淆: 如果你的应用使用了 ProGuard 或 R8 进行代码混淆,请确保添加了必要的规则以保留 Firebase Authentication 和 Google Sign-In SDK 的类。通常,这些规则在库中已经定义好了,但在某些情况下你可能需要手动添加。
  • 用户体验:
    • 提供清晰的登录/注册按钮。
    • 在登录过程中显示加载指示器,避免用户误以为应用无响应。
    • 当登录失败时,向用户提供明确的错误信息。
  • Credential Manager (Android 14+): 对于 Android 14 及更高版本,Google 推荐使用 Credential Manager 来简化和统一身份验证流程,它也可以与 Firebase Authentication 结合使用。Credential Manager 提供更现代的 API 来处理各种凭据类型,包括 Google Sign-In。如果你支持 Android 14+,建议研究 Credential Manager。

通过遵循以上步骤,你就可以在你的 Android 应用中成功实现基于 Firebase Authentication 的 Google 登录功能。这个方案既安全又方便,能够为你的用户提供流畅的认证体验。

https://g.co/gemini/share/ae53a923579e

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88874.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李宏毅(Deep Learning)--(三)

一.前向传播与反向传播的理解&#xff1a;二.模型训练遇到的问题在模型训练中&#xff0c;我们可能会遇到效果不好的情况&#xff0c;那么我们应该怎么思考切入&#xff0c;找到问题所在呢&#xff1f;流程图如下&#xff1a;第一个就是去看训练的损失函数值情况。如果损失较大…

android studio 运行,偶然会导致死机,设置Memory Settings尝试解决

1、android studio导致死机 鼠标不能动&#xff0c;键盘没有反应&#xff0c;只能硬重启&#xff0c;但是内存并没有用完&#xff0c;cpu也不是100% 2、可能的原因 android studio内存设置的问题&#xff0c;为了限制占用内存&#xff0c;所以手工设置内存最小的一个&#x…

HTB 赛季8靶场 - Outbound

Rustscan扫描我们开局便拥有账号 tyler / LhKL1o9Nm3X2&#xff0c;我们使用rustscan进行扫描 rustscan -a 10.10.11.77 --range 1-65535 --scan-order "Random" -- -A Web服务漏洞探查 我们以账号tyler / LhKL1o9Nm3X2登录webmail&#xff0c;并快速确认版本信息。该…

动态组件和插槽

[Vue2]动态组件和插槽 动态组件和插槽来实现外部传入自定义渲染 组件 <template><!-- 回复的处理进度 --><div v-if"steps.length > 0" class"gain-box-header"><el-steps direction"vertical"><div class"l…

Unreal5从入门到精通之如何实现UDP Socket通讯

文章目录 一.前言二.什么是FSocket1. FSocket的作用2. FSocket关键特性三.创建Socket四.数据传输五.线程安全六.UDPSocketComponentUDPSocketComponent.hUUDPSocketComponent.cpp七.SocketTest测试八.最后一.前言 我们在开发UE 的过程中,会经常使用到Socket通讯,包括TCP,UD…

UI前端大数据处理新趋势:基于边缘计算的数据处理与响应

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;前端大数据的 “云端困境” 与边缘计算的破局当用户在在线文档中实时协作…

Reading and Writing to a State Variable

本节是《Solidity by Example》的中文翻译与深入讲解&#xff0c;专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 解说 提示”的方式&#xff0c;带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。Solidity 是以太坊等智能合约平台使用的主要编程语…

c# 深度解析:实现一个通用配置管理功能,打造高并发、可扩展的配置管理神器

文章目录深入分析 ConfigManager<TKey, TValue> 类1. 类设计概述2. 核心成员分析2.1 字段和属性2.2 构造函数3. 数据加载机制4. CRUD 操作方法4.1 添加数据4.2 删除数据4.3 更新数据4.4 查询数据4.5 清空数据5. 数据持久化6. 设计亮点7. 使用示例ConfigManager<TKey, …

运维打铁: Python 脚本在运维中的常用场景与实现

文章目录引言思维导图常用场景与代码实现1. 服务器监控2. 文件管理3. 网络管理4. 自动化部署总结注意事项引言 在当今的 IT 运维领域&#xff0c;自动化和效率是至关重要的。Python 作为一种功能强大且易于学习的编程语言&#xff0c;已经成为运维人员不可或缺的工具。它可以帮…

【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术

文章目录 前言实现天空盒反射1、新建一个cube2、全反射材质3、增加环境反射分辨率反射探针1、一样把小球材质调成全反射2、在小球身上加添加反射探针3、设置静态物体4、点击烘培5、效果6、可以修改反射探针区域大小7、实时反射专栏推荐完结前言 当对象收到直接和间接光照后,它…

React Three Fiber 实现 3D 模型点击高亮交互的核心技巧

在 WebGL 3D 开发中&#xff0c;模型交互是提升用户体验的关键功能之一。本文将基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;总结 3D 模型点击高亮&#xff08;包括模型本身和边框&#xff09;的核心技术技巧&#xff0c;帮助开发者快速掌握复杂…

卷积神经网络实战:MNIST手写数字识别

夜渐深&#xff0c;我还在&#x1f618; 老地方 睡觉了&#x1f64c; 文章目录&#x1f4da; 卷积神经网络实战&#xff1a;MNIST手写数字识别&#x1f9e0; 4.1 预备知识⚙️ 4.1.1 torch.nn.Conv2d() 三维卷积操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化层的作用&#x1f4…

HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位

HarmonyOS应用无响应&#xff08;AppFreeze&#xff09;深度解析&#xff1a;从检测原理到问题定位 在日常应用使用中&#xff0c;我们常会遇到点击无反应、界面卡顿甚至完全卡死的情况——这些都可能是应用无响应&#xff08;AppFreeze&#xff09; 导致的。对于开发者而言&am…

湖北设立100亿元人形机器人产业投资母基金

湖北设立100亿元人形机器人产业投资母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;时长01:20 近日&#xff0c;湖北设立100亿元人形机器人产业投资母基金&#xff0c;重点支持人形机器人和人工智能相关产业发展。 人形机器人产业投资母基金由湖北省财政厅依托省政府…

时序预测 | Pytorch实现CNN-LSTM-KAN电力负荷时间序列预测模型

预测效果 代码主要功能 该代码实现了一个结合CNN&#xff08;卷积神经网络&#xff09;、LSTM&#xff08;长短期记忆网络&#xff09;和KAN&#xff08;Kolmogorov-Arnold Network&#xff09;的混合模型&#xff0c;用于时间序列预测任务。主要流程包括&#xff1a; 数据加…

OCR 识别:车牌识别相机的 “火眼金睛”

车牌识别相机在交通管理、停车场收费等场景中&#xff0c;需快速准确识别车牌信息。但实际环境中&#xff0c;车牌可能存在污渍、磨损、光照不均等情况&#xff0c;传统识别方式易出现误读、漏读。OCR 技术让车牌识别相机如虎添翼。它能精准提取车牌上的字符&#xff0c;不管是…

Java面试基础:面向对象(2)

1. 接口里可以定义哪些方法抽象方法&#xff1a;抽象方法是接口的核心部分&#xff0c;所有实现接口的类都必须实现这些方法。抽象方法默认是 public 和 abstract 修饰&#xff0c;这些修饰符可以省略。public interface Animal {void Sound(); }默认方法&#xff1a;默认方法是…

有哪些更加简洁的for循环?循环语句?

目录 简洁的for循环 循环过程修改循环变量 循环语句 不同编程语言支持的循环语句 foreach 无限循环 for循环历史 break和continue 循环判断结束值 循环标签 循环语句优化 循环表达式返回值 简洁的for循环 如果需要快速枚举一个集合的元素&#xff0c;尽管C语言可以…

RK3568/3588 Android 12 源码默认使用蓝牙mic录音

遇到客户一个需求&#xff0c;如果连接了带mic的蓝牙耳机&#xff0c;默认所有的录音要走蓝牙mic通道。这个功能搞了好久&#xff0c;终于搞定了。1. 向RK寻求帮助&#xff0c;先打通 bt sco能力。此时&#xff0c;还无法默认就切换到蓝牙 mic通道&#xff0c;接下来我们需求默…

解锁HTTP:从理论到实战的奇妙之旅

目录一、HTTP 协议基础入门1.1 HTTP 协议是什么1.2 HTTP 协议的特点1.3 HTTP 请求与响应的结构二、HTTP 应用场景大揭秘2.1 网页浏览2.2 API 调用2.3 文件传输2.4 内容分发网络&#xff08;CDN&#xff09;2.5 流媒体服务三、HTTP 应用实例深度剖析3.1 使用 JavaScript 的 fetc…