android - MSAL acquireTokenSilent 挂起且永不返回
问题描述
我有一个使用 Android Studio 开发的 Java Android 应用程序。在向配置了 OAuth2 的 Azure 托管 Web API 服务发送请求之前,我正在尝试获取缓存的令牌或在过期时获取新的令牌。我正在尝试使用 ISingleAccountPublicClientApplication.acquireTokenSilent() 方法同步获取令牌,因为我想确保在发送 Web 请求之前获得有效的令牌。但是,acquireTokenSilent() 调用挂起并且永远不会返回。有人可以解释为什么它会阻塞吗?
如果我使用 acquireTokenSilenAsync 方法,那么它可以正常工作,但我想避免必须从回调函数发送 Web 请求。
我曾尝试在主线程中使用 acquireTokenSilent() :
try {
mAuthenticationResult = mSingleAccountApp.acquireTokenSilent(SCOPES, AUTHORITY);
} catch (MsalException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
其中 mSingleAccountApp、munthenticationResult、SCOPES 和 AUTHORITY 在 MainActivity 类中声明:
public class MainActivity extends AppCompatActivity {
private final static String[] SCOPES = {"<hidden>"};
private final static String AUTHORITY = "<hidden>";
private ISingleAccountPublicClientApplication mSingleAccountApp;
private IAuthenticationResult mAuthenticationResult;
mSingleAccountApp 在 onCreate 方法中初始化:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PublicClientApplication.createSingleAccountPublicClientApplication(getApplicationContext(),
R.raw.auth_config_single_account, new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
@Override
public void onCreated(ISingleAccountPublicClientApplication application) {
mSingleAccountApp = application;
}
@Override
public void onError(MsalException exception) {
Toast.makeText(getApplicationContext (), exception.getMessage(), Toast.LENGTH_LONG).show();
}
});
我还在获取令牌之前对用户进行身份验证:
mSingleAccountApp.signIn(MainActivity.this, null, SCOPES, getAuthInteractiveCallback());
请注意,我还尝试在单独的线程中调用 acquireTokenSilent 并等待线程完成,并且得到相同的阻塞结果。
谢谢你的帮助。
解决方案
推荐阅读
- php - 单对多关系的获取器只返回一个字符串(Symfony 4.10)
- c++ - 程序不断发送垃圾号码?
- php - Laravel:访问其他文件中的视图作曲家的数据
- mysql - 随机派生表中的随机行
- python - 导入以固定宽度数据块组织的文本文件
- oauth-2.0 - 对 LinkedIn 测试组织的 API 调用
- python - if 语句不触发(python)
- javascript - 使用 v-slot (scoped-slot) 时访问 this.$slots
- scala - 如何避免在 Scala 中调用 asInstanceOf
- azure - 如何检查一个 Web 应用程序是否可以访问 VNet on azure Web 服务中的任何资源?