2013-07-05 36 views
4

在Dropbox網站的Getting started文章中,他們有一個教程,指導如何使用Core API與Android開始。在Android上使用保存的Dropbox身份驗證詳細信息

當應用程序第一次啓動時,會要求用戶對軟件進行身份驗證以使用用戶Dropbox帳戶。驗證成功完成後,您將收到一對驗證字符串,密鑰和密鑰。

在用戶驗證應用程序使用他或她的Dropbox帳戶後,我使用Android的SharedPreferences保存密鑰和secred。

如何使用這些保存的值?我不是指如何使用SharedPreferences檢索它們,但我如何使用它們來防止再次重新驗證應用程序的需要?在Dropbox網站上,他們沒有提供使用這些的方法。他們說的只是

finishAuthentication()方法會將用戶的訪問令牌 綁定到會話。您現在可以通過 mDBApi.getSession()。getAccessTokenPair()來檢索它們。

在您的應用程序關閉後您將再次需要這些令牌,因此 對於將來的訪問保存起來非常重要(雖然此處未顯示)。 如果你不這樣做,用戶每次 使用你的應用程序將不得不重新進行身份驗證。實現存儲密鑰的常用方法是通過Android的SharedPreferences API 。

回答

2

SDK附帶的示例顯示了您可以使用現有訪問令牌創建會話的不同方式。例如,使用該方法setAccessTokenPair:

// Load state. 
    State state = State.load(STATE_FILE); 

    // Connect to Dropbox. 
    WebAuthSession session = new WebAuthSession(state.appKey, WebAuthSession.AccessType.APP_FOLDER); 
    session.setAccessTokenPair(state.accessToken); 
    DropboxAPI<?> client = new DropboxAPI<WebAuthSession>(session); 

或者使用構造:(這些簡單的示例只是加載從狀態文件的訪問令牌)

WebAuthSession sourceSession = new WebAuthSession(state.appKey, Session.AccessType.DROPBOX, sourceAccess); 
    DropboxAPI<?> sourceClient = new DropboxAPI<WebAuthSession>(sourceSession); 

3

的收存箱機器人的JavaDoc似乎擴展了你需要做的更多一點,展示另一個AndroidAuthSession構造函數:

當用戶返回到您的應用程序,你已經保存令牌,只需要創建一個新的會話與他們:

AndroidAuthSession session = new AndroidAuthSession(
    myAppKeys, myAccessType, new AccessTokenPair(storedAccessKey, storedAccessSecret)); 

我想,那麼你只需要實例化一個對象DropboxAPI,你是好去無在startAuthentication()... endAuthentication()等

DropboxAPI<AndroidAuthSession> mDBApi = new DropboxAPI<AndroidAuthSession>(session); 

我還沒有嘗試過這一點,但它本質上是格雷格說同樣的事情。

6

我有同樣的問題,文檔不是很好,所以我看到了幾個相關的問題。 解決此問題的關鍵在AndroidAuthSession類中的方法isLinked()中。我分享我的代碼,以便解決您的疑惑。

public class DropBoxInteractorImpl implements DropBoxInteractor { 
    private DropboxAPI<AndroidAuthSession> mDropBoxApi; 

    public DropBoxInteractorImpl(DropboxAPI<AndroidAuthSession> mDropBoxApi) { 
     this.mDropBoxApi = mDropBoxApi; 
    } 

    @Override 
    public void login(final Context context, final CloudServiceCallback cloudServiceCallback) { 
     String accessToken = PrefUtils.getFromPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, null); 
     if (accessToken == null) { 
      mDropBoxApi.getSession().startOAuth2Authentication(context); 
     } else { 
      mDropBoxApi.getSession().setOAuth2AccessToken(accessToken); 
     } 
    } 

    @Override 
    public void confirmLogin(Context context, final CloudServiceCallback cloudServiceCallback) { 
     AndroidAuthSession session = mDropBoxApi.getSession(); 
     if (session.authenticationSuccessful()) { 
      // Required to complete auth, sets the access token on the session 
      session.finishAuthentication(); 
      String accessToken = mDropBoxApi.getSession().getOAuth2AccessToken(); 
      PrefUtils.saveToPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, accessToken); 
     } 

     if (session.isLinked()) { 
      cloudServiceCallback.loginSuccessful(); 
     } else { 
      cloudServiceCallback.loginError(); 
      Timber.e("There was a problem login in!!"); 
     } 
    } 
} 

我會一步一步解釋它。

  • 首先,我用匕首作爲依賴注入,這就是爲什麼我讓我在構造函數中mDropBoxApi,但如果你不是,就總是創建會話相同的方式,我這個方法是做。

    @Provides 
    @Singleton 
    public DropboxAPI<AndroidAuthSession> providesDropBoxService() { 
        AppKeyPair appKeyPair = new AppKeyPair(Keys.DROPBOX_APP, Keys.DROPBOX_APP_SECRET); 
        AndroidAuthSession session = new AndroidAuthSession(appKeyPair); 
        return new DropboxAPI<AndroidAuthSession>(session); 
    } 
    
  • 現在,你有你的DropboxAPI對象,你需要或者startOAuth2Authentication' or setOAuth2AccessToken`如果你有它已經(保存的表單最後一個會話)。你可以在onCreate(如果它是一個活動)或onActivityCreated中做到這一點,如果它是一個片段。

    @Override 
    public void login(final Context context) { 
        String accessToken = PrefUtils.getFromPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, null); 
        if (accessToken == null) { 
         mDropBoxApi.getSession().startOAuth2Authentication(context); 
        } else { 
         mDropBoxApi.getSession().setOAuth2AccessToken(accessToken); 
        } 
    } 
    
  • 之後,在您的onResume方法(在這裏就是我們要解決我們的問題),你是否登錄成功調用該函數session.authenticationSuccessful()。只有在您進行了認證過程的情況下,這將返回true。如果它不爲空,則登錄不成功或您的帳戶已連接。就是這樣,LINKED。你如何檢查?就像我之前說過的那樣,這是解決這個問題的關鍵。你需要檢查的是如果該會話已經鏈接調用session.isLinked()和voilà。它會告訴你,如果你是成功鏈接到Dropbox的API,或者如果它是假的,在這個過程中有問題。

    @Override 
    public void confirmLogin(Context context, final CloudServiceCallback callback) { 
        AndroidAuthSession session = mDropBoxApi.getSession(); 
        if (session.authenticationSuccessful()) { 
         // Required to complete auth, sets the access token on the session 
         session.finishAuthentication(); 
         String accessToken = mDropBoxApi.getSession().getOAuth2AccessToken(); 
         PrefUtils.saveToPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, accessToken); 
        } 
    
        if (session.isLinked()) { 
         callback.loginSuccessful(); 
        } else { 
         callback.loginError(); 
         Timber.e("There was a problem login in!!"); 
        } 
    } 
    

我希望這個解決你懷疑這件事了,如果你有任何問題,請不要猶豫,問。

相關問題