关于android:钥匙环服务打造无缝的跨设备登录体验

2次阅读

共计 7032 个字符,预计需要花费 18 分钟才能阅读完成。

近些年来,随着手机技术迭代更新越来越快,用户更换手机的周期也在缩短,在这样的背景下,开发者不得不面临以下问题:

同一开发者旗下经常有多个安卓利用和多状态利用(快利用和 Web 利用),用户更换一个新的设施(手机或平板)后,在新设施上登录各利用时每次都须要反复输出帐号和明码,导致用户在登录阶段流失率减少,同时开发者还须要承当额定的短信老本(如用户应用短信登录)。

华为 HMS Core 钥匙环服务(Keyring)提供凭据治理接口(Credentials Management API),为 Android 手机、平板提供用户登录凭据存储和跨利用、跨利用状态、跨设施共享的能力。

钥匙环服务提供了 Android API、Web API 和快利用 API,应用程序通过调用这些 API 来应用钥匙环服务。无论调用哪种模式的接口,所有的用户凭据最终都会存储在 HMS Core 的钥匙环服务中,以便实现对立的凭据治理能力和共享能力。

一、性能特点

钥匙环服务提供登录凭据本地贮存和跨状态、跨利用共享能力。钥匙环服务将用户登录凭据加密贮存在本地设施,被保留的凭据通过钥匙环服务共享至同一开发者旗下的其余快利用、Web 利用和安卓利用;实现跨状态、跨利用无缝登录体验。

钥匙环服务应用端到端加密同步技术实现登录凭据跨设施同步能力。用户在新老设施上关上“凭据多设施同步”性能,就能够在新设施上免密登录同一开发者旗下的各状态利用,实现跨设施无缝登录体验。

例如,同一开发者将旗下的两个安卓利用和两个快利用接入钥匙环服务后,用户只须要在手机 A 和手机 B 上关上“凭据多设施同步”性能,手机 A 上登录一个利用后,用手机 B 登录时无需再输出帐号和明码,实现跨设施、跨利用、跨状态的无缝登录体验。

二、接入劣势

打造无缝登录体验

通过钥匙环服务接口获取本地存储的用户凭据,实现便捷登录。

保障数据安全可靠

用户登录凭据在设施内加密存储,在设施间通过端到端加密技术同步,云端无奈解密。

升高登录流失率

简化用户登录时操作流程,升高流失率

升高经营老本

缩小应用短信登录,升高经营老本

三、开发步骤

开发筹备

具体筹备步骤可参考华为开发者联盟官网。

集成 Keyring 客户端

用户登录场景

1、应用一个 Activity 实例初始化 CredentialClient,能够写在 Activity 的 onCreate 办法中。

CredentialClient credentialClient = CredentialManager.getCredentialClient(this);

2、查问是否存在可用的凭据。

List<AppIdentity> trustedAppList = new ArrayList<>();
trustedAppList.add(new AndroidAppIdentity("yourAppName", "yourAppPackageName", "yourAppCodeSigningCertHash"));
trustedAppList.add(new WebAppIdentity("youWebSiteName", "www.yourdomain.com"));
trustedAppList.add(new WebAppIdentity("youWebSiteName", "login.yourdomain.com"));
SharedCredentialFilter sharedCredentialFilter = SharedCredentialFilter.acceptTrustedApps(trustedAppList);
credentialClient.findCredential(sharedCredentialFilter, new CredentialCallback<List<Credential>>() {
    @Override
    public void onSuccess(List<Credential> credentials) {if (credentials.isEmpty()) {Toast.makeText(MainActivity.this, R.string.no_available_credential, Toast.LENGTH_SHORT).show();} else {for (Credential credential : credentials) {}}
    }
    @Override
    public void onFailure(long errorCode, CharSequence description) {Toast.makeText(MainActivity.this, R.string.query_credential_failed, Toast.LENGTH_SHORT).show();}
});

3、调用 Credential.getContent 获取凭据内容,在 CredentialCallback<T> 获取后果。

private Credential mCredential; 
// 获取的凭据
mCredential.getContent(new CredentialCallback<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {String hint = String.format(getResources().getString(R.string.get_password_ok),
                new String(bytes));
        Toast.makeText(MainActivity.this, hint, Toast.LENGTH_SHORT).show();
        mResult.setText(new String(bytes));
    }
 
    @Override
    public void onFailure(long l, CharSequence charSequence) {
        Toast.makeText(MainActivity.this, R.string.get_password_failed,
                Toast.LENGTH_SHORT).show();
        mResult.setText(R.string.get_password_failed);
    }
});

4、用户输出了新凭据,调用凭据存储接口。

AndroidAppIdentity app2 = new AndroidAppIdentity(sharedToAppName,
                sharedToAppPackage, sharedToAppCertHash);
List<AppIdentity> sharedAppList = new ArrayList<>();
sharedAppList.add(app2);

Credential credential = new Credential(username, CredentialType.PASSWORD, userAuth,
                password.getBytes());
credential.setDisplayName("user_niceday");
credential.setSharedWith(sharedAppList);
credential.setSyncable(true);

credentialClient.saveCredential(credential, new CredentialCallback<Void>() {
    @Override
    public void onSuccess(Void unused) {
        Toast.makeText(MainActivity.this,
                R.string.save_credential_ok,
                Toast.LENGTH_SHORT).show();}
 
    @Override
    public void onFailure(long errorCode, CharSequence description) {
        Toast.makeText(MainActivity.this,
                R.string.save_credential_failed + "" + errorCode +":" + description,
                Toast.LENGTH_SHORT).show();}
});

用户登出场景

1、应用一个 Activity 实例初始化 CredentialClient,能够写在 Activity 的 onCreate 办法中。

CredentialClient credentialClient = CredentialManager.getCredentialClient(this);

2、查问是否存在可用的凭据。

List<AppIdentity> trustedAppList = new ArrayList<>();
trustedAppList.add(new AndroidAppIdentity("yourAppName", "yourAppPackageName", "yourAppCodeSigningCertHash"));
trustedAppList.add(new WebAppIdentity("youWebSiteName", "www.yourdomain.com"));
trustedAppList.add(new WebAppIdentity("youWebSiteName", "login.yourdomain.com"));
SharedCredentialFilter sharedCredentialFilter = SharedCredentialFilter.acceptTrustedApps(trustedAppList);
credentialClient.findCredential(sharedCredentialFilter, new CredentialCallback<List<Credential>>() {
    @Override
    public void onSuccess(List<Credential> credentials) {if (credentials.isEmpty()) {Toast.makeText(MainActivity.this, R.string.no_available_credential, Toast.LENGTH_SHORT).show();} else {for (Credential credential : credentials) {// 能够对可用凭据进行进一步解决,包含:获取凭据相干信息、获取凭据内容、删除}
        }
    }
 
    @Override
    public void onFailure(long errorCode, CharSequence description) {Toast.makeText(MainActivity.this, R.string.query_credential_failed, Toast.LENGTH_SHORT).show();}
});

3、调用 deleteCredential 删除凭据,在 CredentialCallback 获取后果。

credentialClient.deleteCredential(credential, new CredentialCallback<Void>() {
    @Override
    public void onSuccess(Void unused) {String hint = String.format(getResources().getString(R.string.delete_ok),
                credential.getUsername());
        Toast.makeText(MainActivity.this, hint, Toast.LENGTH_SHORT).show();}
 
    @Override
    public void onFailure(long errorCode, CharSequence description) {String hint = String.format(getResources().getString(R.string.delete_failed),
                description);
        Toast.makeText(MainActivity.this, hint, Toast.LENGTH_SHORT).show();}
});

凭据共享机制

通过 API 参数实现凭据共享

在调用 saveCredential 保留凭据时,您能够通过 setSharedWith 设置 Credential 对象的属性实现凭据共享,最多反对共享给 128 个利用。

示例如下:

AndroidAppIdentity app1 = new AndroidAppIdentity("your android app name",
                "your android app package name", "3C:99:C3:....");
QuickAppIdentity app2 = new QuickAppIdentity("your quick app name",
                "your quick app package name", "DC:99:C4:....");
List<AppIdentity> sharedAppList = new ArrayList<>(); // 共享关系列表
sharedAppList.add(app1);
sharedAppList.add(app2);
Credential credential = new Credential("username", CredentialType.PASSWORD, true,
                "password".getBytes());
credential.setSharedWith(sharedAppList); // 设置共享关系
credentialClient.saveCredential(credential, new CredentialCallback<Void>() {
    @Override
    public void onSuccess(Void unused) {
        Toast.makeText(MainActivity.this,
                R.string.save_credential_ok,
                Toast.LENGTH_SHORT).show();}
    @Override
    public void onFailure(long errorCode, CharSequence description) {
        Toast.makeText(MainActivity.this,
                R.string.save_credential_failed + "" + errorCode +":" + description,
                Toast.LENGTH_SHORT).show();}
});

通过 Digital Asset Links 资源实现凭据共享

您能够在 Android 利用的 AndroidManifest.xml 中增加凭据共享关系,办法如下:

1、在 AndroidManifest.xml 的 <application> 节点中增加以下内容:

<application>
           <meta-data
            android:name="asset_statements"
            android:value="@string/asset_statements" />
</application>
  1. 在 res\values\strings.xml 中增加以下内容:
<string name="asset_statements">your digital asset links statements</string>

Digital asset links statements 是一个遵循 Digital Asset links 标准的 JSON 字符串,示例如下:

[{"relation": ["delegate_permission/common.get_login_creds"],
                   "target": {
                            "namespace": "web",
                            "site": "https://developer.huawei.com" // 您的网站域名
                   }
         },
         {"relation": ["delegate_permission/common.get_login_creds"],
                   "target": {
                            "namespace": "android_app",
                            "package_name": "your android app package name",
                            "sha256_cert_fingerprints": ["F2:52:4D:..."]
                   }
         },
         {"relation": ["delegate_permission/common.get_login_creds"],
                   "target": {
                            "namespace": "quick_app",
                            "package_name": "your quick app package name",
                            "sha256_cert_fingerprints": ["C3:68:9F:..."]
                   }
         }
]

relation 属性的值固定为 [“delegate_permission/common.get_login_creds”],示意把凭据共享给 target 属性所形容的利用。

案例分享

航班管家和高铁管家集成华为钥匙环服务,为两亿用户打造无缝登录体验。

理解更多详情 >>

拜访华为开发者联盟官网
获取开发领导文档
华为挪动服务开源仓库地址:GitHub、Gitee

关注咱们,第一工夫理解 HMS Core 最新技术资讯~

正文完
 0