我正在将Azure集成到我的应用程序中。我已在Active Directory目录中的Azure门户创建了应用程序,并使用ADAL库进行集成,但是当我运行应用程序获取Microsoft的登录屏幕时,登录后收到此错误。
登录创建按钮并点击按钮调用此
if (mResult != null) {
// logout
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
authenticationContext.getCache().removeAll();
} else {
// login
authenticationContext.acquireToken(LoginActivity.this,Constant.CLIENT_ID,
Constant.CLIENT_SECRETE_KEY, Constant.REDIRECT_URL, "", PromptBehavior.Auto, "",
callback);//CLIENT_ID=my appid at the of app registration //CLIENT_SECRETE_KEY=secret key of registered app in Active Directory //REDIRECT_URL=passing valid url
}
并在LoginActivity的oncreate()中初始化authenticationcontext
authenticationContext = new AuthenticationContext(LoginActivity.this,
Constant.AUTHORITY_URL, true);// Authority_URL=https://login.windows.net/mydirectoryname.onmicrosoft.com
用于回调
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
authenticationContext.onActivityResult(requestCode, resultCode, data);
}
private void showInfo(String msg) {
Log.e("", msg);
}
private AuthenticationCallback<AuthenticationResult> callback = new AuthenticationCallback<AuthenticationResult>() {
@Override
public void onError(Exception exc) {
showInfo("getToken Error:" + exc.getMessage());
}
@Override
public void onSuccess(AuthenticationResult result) {
mResult = result;
startActivity(new Intent(LoginActivity.this, SecondActivity.class));
if (mResult.getUserInfo() != null) {
Log.v("", "User info userid:" + result.getUserInfo().getUserId()
+ " displayableId:" + result.getUserInfo().getDisplayableId());
}
}
};
并在应用程序注册的Azure门户中获得KEYVAULT和MicrosoftAzureActiveDirectory的许可(登录并阅读用户配置文件权限) 我做错了什么?
答案 0 :(得分:0)
您的参数可能有误。在GitHub上查看此示例:https://github.com/Azure-Samples/active-directory-android/blob/master/TaskApplication/src/main/java/com/microsoft/aad/test/todoapi/ToDoActivity.java#L188。
完成了:
mAuthContext.acquireToken(ToDoActivity.this, Constants.RESOURCE_ID,
Constants.CLIENT_ID, Constants.REDIRECT_URL, Constants.USER_HINT,
new AuthenticationCallback<AuthenticationResult>() {
@Override
public void onError(Exception exc) {
if (mLoginProgressDialog.isShowing()) {
mLoginProgressDialog.dismiss();
}
Toast.makeText(getApplicationContext(),
TAG + "getToken Error:" + exc.getMessage(), Toast.LENGTH_SHORT)
.show();
navigateToLogOut();
}
@Override
public void onSuccess(AuthenticationResult result) {
if (mLoginProgressDialog.isShowing()) {
mLoginProgressDialog.dismiss();
}
if (result != null && !result.getAccessToken().isEmpty()) {
setLocalToken(result);
sendRequest();
} else {
navigateToLogOut();
}
}
});
无论如何,您不应该在移动应用中保密您的客户端。任何人都可以打开您的应用程序并找到它。
答案 1 :(得分:0)
if(result!= null&amp;&amp;!result.getAccessToken()。isEmpty()){ 是错误的,添加令牌空检查或添加getStatus成功检查...
是的,ms特别创建了不好的android示例[我认为:)];
最简单的方法是在AD下打开你的应用程序并打开编辑清单: 来自样本: AUTHORITY_URL - 来自应用清单的“identifierUris”(不是Android清单;来自广告注册的web-api app的add-manifest); CLIENT_ID - 是appId; RESOURCE_ID - 来自清单; “requiredResourceAccess”:[{“resourceAppId”:有时它出现在auth ex message中;
您也应该在AD应用中添加相同的回复网址;
如果由于某种原因将auth直接重定向到todoactivity后会导致失败状态,但如果打开添加用户,您可以看到登录用户信息并登录成功状态;
所以修好那个样本之后就可以了,但这是一个艰难的1-2天头脑风暴; 期望更多的形式ms样本,看起来每年的质量都会变得更低;