【问题标题】:Azure AD B2C Token Expiry MSAL in Native Android本机 Android 中的 Azure AD B2C 令牌到期 MSAL
【发布时间】:2021-08-17 21:07:51
【问题描述】:

我正在使用 MSAL 在我的原生 android 应用程序上集成 azure adb2c。我的令牌到期在门户中设置为 60 分钟。目前,每次应用启动时我都会调用acquireTokenSilentAsync,以确保access token is not expired。但是有什么方法可以避免每次调用acquireTokenSilentAsync 并且只在access token 过期时才进行调用?这是为了让应用加载更快,避免每次调用acquireTokenSilentAsync

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.microsoft_azure);
        context = MicrosoftAzureActivity.this;
        initializeUI();
        // Creates a PublicClientApplication object with res/raw/auth_config_single_account.json
        PublicClientApplication.createSingleAccountPublicClientApplication(MicrosoftAzureActivity.this,
                R.raw.auth_config_single_account,
                new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
                    @Override
                    public void onCreated(ISingleAccountPublicClientApplication application) {
                        /**
                         * This test app assumes that the app is only going to support one account.
                         * This requires "account_mode" : "SINGLE" in the config json file.
                         **/
                        loadAccount();
                    }

                    @Override
                    public void onError(MsalException exception) {
                        displayError(exception);
                    }
            

});
}

Interactively fetching Token:

    mSingleAccountApp.signIn(MicrosoftAzureActivity.this, null, getScopes(), getAuthInteractiveCallback());

Load Account when already token is fetched Interactively and account is already Loaded:

 private void loadAccount() {
        if (mSingleAccountApp == null) {

            Log.d("SKT","Account Not Signed In");
            return;
        }
        Log.d("SKT","Account Not Signed In#1");

        mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback() {
            @Override
            public void onAccountLoaded(@Nullable IAccount activeAccount) {
                // You can use the account data to update your UI or your app database.
                mAccount = activeAccount;
                if (activeAccount != null) {
                    Log.d("SKT","Account Already Signed In");
              
         mSingleAccountApp.acquireTokenSilentAsync(getScopes(), B2CConfiguration.getAuthorityFromPolicyName("B2C_1_SignInSignUp"), getAuthSilentCallback());

                }
            }

            @Override
            public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable IAccount currentAccount) {
                if (currentAccount == null) {
                    // Perform a cleanup task as the signed-in account changed.
                    showToastOnSignOut();
                }
            }

            @Override
            public void onError(@NonNull MsalException exception) {
                displayError(exception);
            }
        });
    }

【问题讨论】:

    标签: android microsoft-graph-api azure-ad-b2c access-token msal


    【解决方案1】:

    不,您必须为此调用acquireTokenAsync,它会评估缓存中的令牌是否已过期或与请求的范围不同。如果两者都不是,则 MSAL 从缓存中返回令牌,它不会进行任何网络调用并且应该几乎是即时的。做任何不同的事情都不会获得任何性能优势,因为这是最低限度的。

    【讨论】:

    • Suri - 所以为了获得最佳实践,我每次都必须致电acquireTokenAsync ,上面的代码似乎也正确?
    • 从技术上讲,您需要进行静默令牌调用的唯一时间应该是在 API 调用之前。但是如果由于某种原因您需要在应用打开时检查令牌的有效性,那么您可以这样做。
    • Suri - 我们如何检查令牌有效性是否已过期?你能帮我吗?
    • 调用acquireTokenSilent()。你为什么要检查这个 - 这是在使用 MSAL 访问受保护资源之前执行的检查。
    猜你喜欢
    • 2021-01-03
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2017-11-23
    • 1970-01-01
    • 2021-12-28
    • 2018-01-08
    相关资源
    最近更新 更多