android 不同方式登录总结

时间:2024-03-08 08:32:42

普通登录

在移动互联网下,app时代已经不知不觉的进入到了我们的生活当中,不同的app当中登录方式也是各式各样的,到底用户喜欢哪种用户方式呢?接下来我们根据几种常见的方式进行配置总结。

一、注册登录(最常用不做详细介绍)

1、游客登录

游客登录,就是让用户在先体验后登录。在如今全民APP时代,一些不出名的APP若让用户一打开APP就要求注册、登录,势必会造成转化率底下。这时,网站时代盛行的游客登录就很好被运用在APP上。

 

2、第三方账号登录

  APP采用这种登录方式,可以有效降低注册的门槛从而提高了用户的转化率,避免了用户去重新注册账号而产生的记忆负担。但是,最好不要让用户使用第三方账号登录之后,还要求用户再注册一个账号。

 

  第三方账号登录常常还会带来一个很严重的问题!因为长时间没有进行过登录操作,用户忘了自己到底是用哪个第三方账号注册的账号。

 

  还有一种情况,接入的第三方停止了服务(SDK升级老接口不适用现版本),会用户的大量丢失。所以,第三方账号登录的接口选择很重要。为了预防这类情况的发生,做好第三方账号登录的用户向传统的账号登录的导流很重要。当然,我们也可以将不同接口的账号相关联,这可以有效地解决上述两个问题。

 

  设计APP登录方式时,我们一定要想清楚使用第三方账号登录的根本目的是什么,到底是为了降低登录门槛还是为了利用社交渠道进行分享?或是其他的目的。在达到目的的同时,也一定要避开这其中的坑。

 

3、账号登录(注册式)

直接使用邮箱、手机号码等进行登录是最为传统的登录方式,这类登录方式常常需要用户跳出APP进行验证操作。用户在APP里的操作尚可加以控制,一旦用户跳出APP,很容易就会被其他东西吸引了注意力而中断了操作。而且,还有其他不可控的因素,如进行邮箱验证时,邮件被屏蔽了、邮箱软件要升级升完忘了验证了,这些都有可能发生。

 

4、账号登录(管理员提供)

管理员提供账号密码,这种方式一般是针对企业内部定制APP管理软件,系统管理员会在人员产生时候时后台库里配置一个账户和初始化密码给到使用人员,这种方式局限性就是外界无法使用。

 

 

新型登录(手势、声音、指纹、人脸)

随着科技发展,越来越多的传感器被利用起来,如支付宝的手势登录、微信的声音锁、APP的指纹支付等。这些新型登录方式的使用主要需要考虑两个方面:①技术是否够成熟,如利用声音、指纹、人脸等方式时,我们需要考虑技术的容错率是否达到理想状态,这很大程度上会影响用户的体验。②用户方面造成的无法登录,如果用户感冒声音改变,怎样实现解决方案? 又如指纹手机录入指纹,切换手机后是否能直接识别?都是值得我们考虑的问题。

接下来根据指纹和人脸识别进行大致介绍实现!

 

一、   指纹登录

指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别。另外,实际开发场景中,使用指纹的主要场景有两种:

 

纯本地使用。即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台。

与后台交互。用户在本地完成指纹识别后,需要将指纹相关的信息传给后台。

 

由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得。

上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说:

纯本地的使用指纹识别功能,只需要对称加密即可;

后台交互则需要使用非对称加密:将私钥用于本地指纹识别,识别成功后将加密信息传给后台,后台开发人员用公钥解密,以获得用户信息。

 

 

1、方案一(实现分析)

分析:

 

1、指纹Demo:

①、检测AndroidAPI是否大于等于23

②、检测硬件是否支持

③、设备是否录入指纹

④、开始认证

⑤、处理认证结果

 

2、 服务器交互

①    、数据上传

②    、登录验证

③    、加密处理

 

 

 

 

 

 

 

 

 

1、相关实现

理解并调用以下API就可以实现。

 

相关类:

1.FingerprintManager:主要用来协调管理和访问指纹识别硬件设备

2.FingerprintManager.AuthenticationCallback这个一个callback接口,当指纹认证后系统会回调这个接口通知app认证的结果是什么

3.FingerprintManager.AuthenticationResult这是一个表示认证结果的类,会在回调接口中以参数给出

4.FingerprintManager.CryptoObject这是一个加密的对象类,用来保证认证的安全性

 

开始扫描用户按下的指纹
调用authenticate()函数;

public void authenticate(

@Nullable CryptoObject crypto,            //加密类对象;

@Nullable CancellationSignal cancel,        //用来取消当前扫描操作(30s才超时);

int flags,                                //标识位,暂时设置为0即可;

@NonNull AuthenticationCallback callback,  //认证结果回调;

@Nullable Handler handler)               //使用handler的Looper处理指纹识别硬件的信息;为null,则使用app的main

 

请求认证指纹,获得结果,根据结果下一步的工作在activity继承FingerprintManager实现

Activity extends FingerprintManager.AuthenticationCallback {}

 

FingerprintManager用来保证认证结果的完整性。通常来讲,用来加密指纹扫描结果的机制就是一个Javax.Crypto.Cipher对象。Cipher对象本身会使用由应用调用Android keystore(Android提供的一个用来保存 Key-Value的文件)的API产生一个key来实现上面说道的保护功能。

 

2、方案二(实现分析)

分析:

①    、Android6.0后且确保硬件支持;

②    、实现密码登录和指纹登录相互切换;

③    、检测设备是否支持指纹验证 主要用到系统Api-FingerprintManager;

④    、指纹验证失败后错误提示;

⑤    、关闭指纹登录

⑥    、检测系统指纹库发生变化后的处理

 

 

使用:

 

ingerprintManager类,FingerprintManager在最新的Android 9.0系统上已经被废弃了,当Google在v4包中把FingerprintManager改为了FingerprintManagerCompat,而Compat是兼容的意思,所以Google在v4包中做了一些兼容性处理,官方推荐使用后者。所以本demo用的就是FingerprintManagerCompat工具类

 

1、申请权限

<uses-permission android:name="android.permission.USE_FINGERPRINT"/>

 

2、验证手机是否支持指纹,如果手机不支持,那就没办法了

 

FingerprintManagerCompat提供了三个方法:

    A、isHardwareDetected() 判断是否有硬件支持

    B、isKeyguardSecure() 判断是否设置锁屏,因为一个手机最少要有两种登录方式

    C、hasEnrolledFingerprints() 判断系统中是否添加至少一个指纹

 

 

 

 

 

 

3、 开启指纹登录,一般来说都是弹出个提示框用于显示指纹识别的状态

首先,生成一个对称加密的key

 

 

然后,通过生成的key初始化生成一个Cipher对象

 

 

最后,通过上面生成的Cipher去开启指纹验证

 

 

 

 

 

开启指纹验证的时候的步骤:

1、  创建一个FingerprintManagerCompat对象,上面有说到谷歌已经不推荐使用FingerprintManager类。

 

 

2、拿到FingerprintManagerCompat对象后就可以调authenticate方法进行指纹识别了,这里面需要传递几个参数:

(1)CryptoObject 这是一个加密类的对象,指纹扫描器会使用这个对象来判断认证结果的合法性。这个对象可以是null,但是这样的话,就意味这app无条件信任认证的结果,虽然从理论上这个过程可能被攻击,数据可以被篡改,这是app在这种情况下必须承担的风险。因此,建议这个参数不要置为null。这里就需要使用之前初始化的Cipher去创建一个CryptoObject 对象。

 

(2)flags 标识位,这个标志位应该是保留将来使用的,在这里我们传0就可以了。

(3)cancel这个是CancellationSignal类的一个对象,这个对象用来在指纹识别器扫描用户指纹的是时候取消当前的扫描操作,如果不取消的话,那么指纹扫描器会移植扫描直到超时(一般为30s,取决于具体的厂商实现),这样的话就会比较耗电。建议这个参数不要置为

null。识别过程中可以手动取消指纹识别。

 

(4)callback这个参数很重要,看名字就知道这是个回调的接口,这个参数等最后我们详细来介绍。这个参数不能为null。

(5)handler这是Handler类的对象,FingerprintManagerCompat将会使用这个handler中的looper来处理来自指纹识别硬件的消息。一般来说,我们开发的时候可以直接传null,因为FingerprintManagerCompat会默认使用app的main looper来处理。

 

3、最后我们来说一下刚才的callback这个参数

 

 

 

 

 

 

二、 人脸识别登录

Android人脸原理基本是录入个人的人脸面部信息。摄像头采集到的面部信息之后,然后采样做对比从而匹配解锁(相似度)。

1、方案一(实现分析)

百度平台 https://ai.baidu.com/tech/face/detect

 

①    企业认证

 

         想要下载百度人脸识别的SDK必须要通过企业认证,需要企业的营业执照

 

②    创建授权

 

通过企业认证并申请成功后,就可以创建授权了。点击人脸识别后台管理中的客户端SDK管理创建授权。

   

 

 

 

 

 

 

 

以android为例,我们需要先创建一个签名文件,并记住别名、密码和store的密码,之后的程序中会使用到。创建签名后获得签名的MD5填入到新建授权最后一项。

 

③    、下载示例工程

创建授权成功后就可以下载示例工程了,这里选择人脸登录的android示例工程。下载时选择自动配置授权信息,选择刚才创建的授权名。选择自动配置授权信息,需要我们配置的地方就不多了。

 

④    编译程序

下载示例工程后解压,然后用Android Studio打开,配置相应的版本号。

接下来要修改程序了,首先修改Config.java中的代码,修改成自己的配置项:

 

然后修改build.gradle配置,这里就需要使用到创建授权中的签名信息:

 

 

这里特别要注意的是keyPassword和storePassword使用了同一个变量。如果你的这两个密码不一样的话,可以再加一个变量。修改配置后要记得同步一下。然后运行配置好的demo测试。

 

 

2、方案二(实现分析)

虹软平台 https://ai.arcsoft.com.cn/index.html (免费)

 

ArcFace 虹软人脸认知引擎简介

 

目前开放的版本有人脸比对(1:1)和人脸检索(1:N),根据应用场景可选择

人脸检索分为小型网络(检测100人内),中型网络(1000人内),大型网络(需联系虹软官方)

目前开放的功能有人脸比对,人脸识别,人脸追踪

 

第一步:在虹软平台创建应用。

 

 

创建后查看SDK激活码:

 

 

 

 

下载虹软识别库地址:https://gitee.com/xiaoming723/arcface

下载好之后进行依赖添加:

implementation \'com.github.tyhjh:PermissionUtil:v1.0.5\'

implementation \'com.github.tyhjh:picturePickUtil:v1.0.6\'

implementation project(\':arclibrary\')

接下来进入步骤详解:

 

 

 

 

 

 

 

 

 

 

 

 

 

Constants为存储虹软信息的常量类,主要存放APPID等信息,这些信息在查看激活码里面有:

 

在activity里进行:

 

人脸识别注册:

LivenessActivity.flag = 1;

startActivity(new Intent(MainActivity.this, LivenessActivity.class));

人脸识别登录:

LivenessActivity.flag = 2;

startActivity(new Intent(MainActivity.this, LivenessActivity.class));

 

以上只是本地注册和登录,咱们需要和服务端进行交互,那么注册时,就要绑定faceId,对faceId进行存储。当用户对人脸识别开启后,进行本地人脸识别登录校验,成功后,请求刷脸登录接口。

 

 

人脸识别,有的朋友so库找不到,应该是与其依赖的第三方中的架构产生冲突,解决办法如下,指定架构方式,在app下,android,defaultConfig下:

ndk {

//选择要添加的对应cpu类型的.so库。 // 还可以添加 \'x86\', \'x86_64\', \'mips\', \'mips64\'

abiFilters \'armeabi-v7a\' //\'armeabi-v7a\', \'arm64-v8a\'

moduleName "app"

}

sourceSets {

main {

jniLibs.srcDirs = [\'src/main

bs\']//指定你的libs路径

}

}

 

 

 

3、方案三(实现分析)

腾讯平台 https://ai.qq.com/

 

前期操作就是一系列的申请啊,拿到对应的AppId 和 keyLicence,secret ,没什么要求,就是等待审核(和百度虹软一样)