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

相關問題