热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Firebase初探:身份认证

Firebase初探:身份认证用户使用app的第一步,就是身份认证,包括注册,登陆还有登出功能。Firebase的Auth模块就是对应身份认证这一点的。Firebase的登陆方式除了基本的

Firebase初探:身份认证

用户使用app的第一步,就是身份认证,包括注册,登陆还有登出功能。Firebase的Auth模块就是对应身份认证这一点的。Firebase的登陆方式除了基本的邮箱+密码方式,还有第三方账号的登陆方式,包括Google,Facebook,twitter和Gihub,除此之外,Firebase也允许开发者自定义登陆方式
在启用某种登录方式时,需要在Firebase控制台的Auth模块中,在”登录方法“标签页下进行对应的启用


邮箱+密码

首先先来看最基本的邮件+密码方式。
为了使用身份认证功能,需要为项目添加对firebase-auth库的依赖:

dependencies {
    // ...
    compile 'com.google.firebase:firebase-auth:9.0.0'
}

FirebaseAuth是Firebase身份认证的入口,就是由它来完成身份认证的各种功能
FirebaseAuth使用了单例模式,应用的FirebaseAuth对象通过FirebaseAuth.getInstance()获得(说是单例但其实不是很准确,因为getInstance()方法的说明是”返回默认的FirebaseApp实例所对应的FirebaseAuth实例“,该方法也有一个接收FirebaseApp参数的重载版本,但是应用通常不需要和FirebaseApp交互,所使用的FirebaseApp实例就是默认的版本,所以狭义地来说是”单例的“)

注册

FirebaseAuth的注册方法是:

public Task createUserWithEmailAndPassword (String email, String password)

其中这两个参数分别是邮件和密码。方法将会立即返回一个Task对象,Task类是用于处理Firebase异步操作的,必须使用一个TResult作为类型参数,表示此次操作的结果。对于身份,认证这里最终会返回一个AuthResult对象,表示此次认证操作的结果
为了监听认证操作的结果,需要为这个Task对象添加一个OnCompleteListener:

public Task addOnCompleteListener (OnCompleteListener listener)

在对OnCompleteListener的实现中,需要实现onComplete方法,
我们可以根据Task对象的isSuccessful()方法来判断此次操作是否成功,然后进行相应的逻辑
所以,总体的代码是:

mAthu.createUserWithEmailAndPassword(
             email.getText().toString(),
             password.getText().toString()
         )
         .addOnCompleteListener(this, new OnCompleteListener() {
             @Override
             public void onComplete(@NonNull Task task) {
                 if (!task.isSuccessful()) {
                     // ...
                 } else {
                     // ...
                 }
             }
         });

当注册成功后,用户会自动登录,即FirebaseAuth会相应地发生改变,为了监听FirebaseAuth状态的变化,可以给其添加一个AuthStateListener。需要注意的是,因为FirebaseAuth是单例的,而且可能会在多个多个活动中使用到FirebasAuth(比如登入,登出,注册等等),所以需要在活动start和stop的时候分别进行add和remove监听器,以防发生冲突:

private FirebaseAuth.AuthStateListener mAuthListener;

@Override
protected void onCreate(Bundle savedInstanceState) {

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // 用户已登入或发生改变
            } else {
                // 用户已注销
            }
        }
    };
}

@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

通过getCurrentUser()得到对应的FirebaseUser对象,它提供了当前用户的各种用户信息,例如:

方法 作用
String getUid() 返回用户的uid
String getDisplayName() 返回用户名
String getEmail() 返回用户email
String getPhotoUrl() 返回用户头像
boolean isAnonymous() 是否匿名
Task updatePassword(String) 更新密码
Task updateEmail(String) 更新email

登录和注销

FirebaseAuth的邮箱登录和注销方法分别是

Task signInWithEmailAndPassword(String, String)
void SignOut()

登录和注册实现的区别,就是按钮点击事件中把对应的方法替换即可,其他的监听代码部分,除了处理逻辑外大致相同


Google登录

Google Play Services SDK中也提供了使用Google账号的验证方式
为了使用这个功能,除了必须的firebase-auth库,还需要为项目添加依赖:

dependencies { compile 'com.google.android.gms:play-services-auth:9.0.0' }

配置Google Sign In方案

GoogleSignInOptions

GoogleSignInOptions将为后面的登录设定一些选项,它使用建造者模式来产生一个对象。通常会使用默认的DEFAULT_SIGN_IN,然后再为其添加一些额外选项。注意,如果要使用后端服务器或者Google Sign-In进行认证,必须为其提供服务器的OAuth2.0客户端ID,对于Google Sign-In,在将google-services.json添加到项目中并sync完成后,XML中将会自动地加入一系列地配置信息,其中就包括默认的服务器客户端ID:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

GoogleApiClient

GoogleSignInOptions是用来提供登录选项的,那谁来负责登录呢?就是GoogelApiClient了,关于GoogleApiClient的生成比较复杂,根据官方的建议,一般的写法是:

mGoogleApiClient = new GoogleApiClient.Builder(this)
        .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
        .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
        .build();

需要注意的是,enableAutoManage方法是用一个FragmentActivity来自动管理GoogleApiClient,一般是当前所在的活动,该活动必须继承于FragmentActivity或AppCompatActivity,否则就必须手动管理GoogleApiClient的连接周期。另一个参数则是用来监听连接失败时间的监听器
在addApi方法中,传入之前创建的GoogleSignInOptions对象

SignInButton

Google推荐使用专门的Button来作登录按钮:

这个控件就是SignInButton。它提供了setSize(),setColorScheme()和setScopes()来为外观进行定制

set方法 预设常量
setSize(int) SIZE_ICON_ONLY
SIZE_STANDARD
SIZE_WIDE
setColorScheme(int) COLOR_AUTO
COLOR_DARK
COLOR_LIGHT

需要使用到的三个部件介绍完了,接下来就是Google Sign-In的登录流程:

  1. SignInButton点击事件

    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);

    Google账号登录需要开启一个专门的活动来进行账号的选择

  2. 设置回调逻辑

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                // ...
            } else {
                // ...
            }
        }
    }

Google Sign-In的介绍就大概是这样了
至于第三方账号的支持,如Facebook,Twitter和Github,流程基本都是根据对应SDK获得对应的令牌对象,然后根据令牌创建AuthCredential,最后FirebaseAuth调用signInWithCredential()方法进行登录即可


由于服务器自定义认证的方式涉及到服务器的配置,所以介绍的篇幅会比较长,这里就不作介绍,等到以后有机会再写吧
Firebase的身份认证模块就介绍到这了,后面将会持续对其他模块进行学习


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
author-avatar
dengdaidanlan_738_260
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有