2

我正在开发一个Android 3.0程序,该程序可以连接到SSL'd php webservice(输出JSON数据,我可以修改服务器)。连接到此服务的平板电脑具有企业Microsoft ActiveSync(Exchange 2010)帐户,并且只有该帐户(不包括谷歌帐户,FB等)。我想编写一个程序,可以使用平板电脑android.accounts.AccountManager中保存的凭据在该PHP web服务上发出安全请求。我尝试了一些谷歌示例,但我认为问题在于我使用该行时: AccountManagerFuture<Bundle> data = am.getAuthToken(b, "JWT", options, this, ota, null); 应用程序只是挂起,我没有得到任何结果。实际上,在OnTokenAcquired类中的任何一行设置断点都不会做任何事情。 AKA OnTokenRequired从未得到执行通过Android的AccountManager获取Microsoft Exchange身份验证令牌

任何建议或方向?我敢肯定,这可以为企业获取Android客户端软件是有帮助的

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.accounts.AccountManagerFuture; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.EditText; 
public class AcctestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     AccountManager am = AccountManager.get(this); 
     EditText et = (EditText) findViewById(R.id.editText1); 
     OnTokenAcquired ota = new OnTokenAcquired(et); 
     Account exchange = null; 
     Bundle options = new Bundle(); 
     for(Account a : am.getAccounts()){ 
       if(a.type.equals("com.android.exchange") && a.name.endsWith("@domain.com")) 
        exchange = a; 
     } 
     AccountManagerFuture<Bundle> data = am.getAuthToken(exchange, "JWT", options, this, ota, null); 
    } 
} 

import android.accounts.AccountManager; 
import android.accounts.AccountManagerCallback; 
import android.accounts.AccountManagerFuture; 
import android.accounts.AuthenticatorException; 
import android.accounts.OperationCanceledException; 
import android.os.Bundle; 
import android.widget.EditText; 
import android.widget.Toast; 
import java.io.IOException; 
import java.util.concurrent.TimeUnit; 
public class OnTokenAcquired implements AccountManagerCallback<Bundle> { 
     private EditText et; 
     public OnTokenAcquired(EditText et){ 
       this.et = et; 
     } 
     public void run(AccountManagerFuture<Bundle> result) { 
       Bundle bundle; 
       try { 
        Toast.makeText(null, "Start!", Toast.LENGTH_LONG).show(); 
        bundle = result.getResult(1, TimeUnit.SECONDS); 
        String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);       et.append("\nToken: " + token); 
        Toast.makeText(null, token, Toast.LENGTH_LONG).show(); 
       } catch (OperationCanceledException e) { 
        e.printStackTrace(); 
       } catch (AuthenticatorException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       }    
     } 
} 

回答

0

在源研究的一些小时之后,我发现这个代码:

public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle loginOptions) throws NetworkErrorException { 
    return null; 
} 

这意味着,Android的交换验证器与Exchange Server不提供Tokenbased认证...

+0

你知道这是否在2016年发生了变化? –

0

你要通过正确的令牌类型为Exchange帐户。我不知道这是什么,但我怀疑这是'测试'。先研究合适的令牌类型(如果支持)。否则你的代码看起来不错。尽管如何使用令牌对Exchange进行身份验证是另一回事。

+0

检查我的回应编辑。我不能适应所有这些,我发布了更新的代码 – thebehera

+0

您的PHP服务使用什么类型的身份验证?什么让你认为你需要一个“JWT”标记?事实证明,默认的Exchange验证器不支持令牌,它只是返回null。 –

+0

嗯..我开始寻找[几个指南](http://msdn.microsoft.com/en-us/library/cc425499%28v=EXCHG.%2080%29.aspx)。 [此xoauth指南](http://msdn.microsoft.com/en-us/library/hh745374.aspx)主要是我认为使用智威汤逊或沿着这些线路的东西。 PHP webservice现在不使用身份验证,我正在试图弄清楚它的过程。我正在考虑使用SSL使用身份验证令牌将数据加密到SSL服务器,以便Web服务可以跟踪哪个员工正在使用该服务。所以如果没有authtoken,有关如何做SSO的任何想法? – thebehera

相关问题