身份验证失败:com.microsoft.identity.client.exception.MsalClientException:缺少类型为 {0} 的必需令牌

Authentication failed: com.microsoft.identity.client.exception.MsalClientException: Missing required tokens of type: {0}

实现了 Azure B2C 登录。

应用程序突然出现此错误。 找不到问题出在哪里。 谁能帮忙

我们使用以下来源: https://github.com/Azure-Samples/ms-identity-android-java

下面的代码用于生成 KeyHash

public static void getKeyHash(Context mAppContext){
        final String packageName = mAppContext.getPackageName();
        try {
            final PackageInfo info = mAppContext.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
            for (final Signature signature : info.signatures) {
                final MessageDigest messageDigest = MessageDigest.getInstance("SHA");
                messageDigest.update(signature.toByteArray());
                final String signatureHash = Base64.encodeToString(messageDigest.digest(), Base64.NO_WRAP);
                Log.i("Utils", "signatureHash-->"+signatureHash);
            }
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
            Log.e("Utils", "Unexpected error in verifyRedirectUriWithAppSignature()", e);
        }

    }

具有授予权限的范围和在 android 代码中使用的相同范围 URL

我忘记了offline_access权限 添加此权限应用后工作

我重现了你的问题并成功解决了。

这是因为您没有对 Azure 门户的 API 权限进行管理员同意。

官方示例代码请见this line

public static List<String> getScopes() {
        return Arrays.asList(
                "https://fabrikamb2c.onmicrosoft.com/helloapi/demo.read");
    }

此示例将范围设置为 https://fabrikamb2c.onmicrosoft.com/helloapi/demo.read,以便它可以获得此 API 的访问令牌。

首先,您应该添加代表您的网站的应用程序注册 API 并按照 Quickstart: Configure an application to expose a web API.

公开 API

其次,您需要按照Quickstart: Configure a client application to access a web API.

在客户端应用程序注册中添加API权限(其客户端ID在auth_config_b2c.json文件中配置)

现在最重要的是在 Azure 门户中进行管理员同意:

您可以在 Azure 门户中点击权限查看。

将代码中的scope修改为自己的scope/permission.

public static List<String> getScopes() {
        return Arrays.asList(
                "https://allentest001.onmicrosoft.com/api/demo.read");
    }

配置好所有设置后,我们可以在登录后获取访问令牌。