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

同一开发者旗下常常有多个安卓运用和多形状运用(快运用和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获取结果。

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>
           <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 最新技能资讯~