2016-12-09 1 views
2

보관 용 계정을 찾아보기 위해 this sample을 사용하고 있습니다. 현재 사용자를 로그 아웃하고 새 계정에 로그인하는 옵션을 제공하는 기능을 추가하고 싶습니다. 이것을 위해 나는 내가 사용할 수있는 것을 발견했다. dbxClientV2.auth().tokenRevoke()앱에서 보관 용 계정 하나의 연결을 해제하는 방법은 무엇입니까?

그래서 DropboxClientFactory를로 변경했다.

public class DropboxClientFactory { 
    private static DbxClientV2 sDbxClient; 
    public static void init(String accessToken) { 
     if (sDbxClient == null) { 
      DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("examples-v2-demo") 
        .withHttpRequestor(OkHttp3Requestor.INSTANCE) 
        .build(); 

      sDbxClient = new DbxClientV2(requestConfig, accessToken); 
     } 
    } 

    public static DbxClientV2 getClient() { 
     if (sDbxClient == null) { 
      throw new IllegalStateException("Client not initialized."); 
     } 
     return sDbxClient; 
    } 

    public static void revokeClient(final CallBack callBack) { 
     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        sDbxClient.auth().tokenRevoke(); 
       } catch (DbxException e) { 
        Log.e("Dropbox", "Access Revoke Exception", e); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       sDbxClient = null; 
       if (callBack != null) 
        callBack.onRevoke(); 
      } 
     }.execute(); 

    } 

    public interface CallBack{ 
     void onRevoke(); 
    } 
} 

및 DropboxActivity에 revokeToken 기능을 추가했습니다.

public abstract class DropboxActivity extends AppCompatActivity { 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE); 
     String accessToken = prefs.getString("access-token", null); 
     if (accessToken == null) { 
      accessToken = Auth.getOAuth2Token(); 
      if (accessToken != null) { 
       prefs.edit().putString("access-token", accessToken).apply(); 
       initAndLoadData(accessToken); 
      } 
     } else { 
      initAndLoadData(accessToken); 
     } 
    } 

    private void initAndLoadData(String accessToken) { 
     DropboxClientFactory.init(accessToken); 
     PicassoClient.init(getApplicationContext(), DropboxClientFactory.getClient()); 
     loadData(); 
    } 

    protected abstract void loadData(); 

    protected boolean hasToken() { 
     SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE); 
     String accessToken = prefs.getString("access-token", null); 
     return accessToken != null; 
    } 

    protected void removeToken(DropboxClientFactory.CallBack callback) { 
     SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE); 
     prefs.edit().remove("access-token").apply(); 
     DropboxClientFactory.revokeClient(callback); 
    } 
} 

을 다음과 같이 전체 수정 DropboxActivity 그래서 로그 아웃에 나는 우리가 응용 프로그램의 현재 세션에 로그인하지 않은 경우

removeToken(new DropboxClientFactory.CallBack() { 
    @Override 
    public void onRevoke() { 
     onResume(); 
    } 
}); 

이 잘 작동 전화입니다. 그러나 앱의 동일한 세션에서 토큰을 생성하고 서명 한 후 나중에 해당 토큰을 폐기하면 Auth.getOAuth2Token()은 나중에 다른 계정에서 몇 번 로그인했는지에 관계없이 이전에 폐기 된 토큰을 여전히 반환합니다. 이 응용 프로그램의 동일한 세션에서 기록 된 토큰은 Auth 클래스에서도 제거 할 수 없습니다. 이 문제를 해결하는 방법? 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

명확하게하기 위해 "앱의 현재 세션에서 토큰을 시도하여 유효하지 않은 토큰을 반환합니다"라고 말하면 실패한 부분에 대해 코드와 결과 오류를 공유 할 수 있습니까? – Greg

+0

'tokenRevoke' 메소드는 서버로 토큰을 취소하고'getOAuth2Token' 메소드는 단지 인증 활동에서 토큰을 검색합니다. 이미 지속성 ('SharedPreferences')에서 토큰을 제거하고있는 것처럼 보입니다. 그러나 메모리에 취소 된 토큰을 가진 기존 클라이언트를 버리지 않을 수 있다는 문제가있을 수 있습니다. – Greg

+0

예. 'tokenRemove'는 서버의 토큰을 취소합니다. 그리고'SharedPreferences'에서 토큰을 제거합니다. 그러나 토큰을 버리는 방법은? Auth는 dropbox-api가 제공하는 클래스이며 기존 키를 버리는 정확한 방법을 제공하지 않습니다. 나는 드랍 - 박스 api에 새로운 종류입니다. – SysClaude

답변

1

같은 문제가있었습니다.

protected void removeToken(DropboxClientFactory.CallBack callback) { 
    SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE); 
    prefs.edit().remove("access-token").apply(); 
    com.dropbox.core.android.AuthActivity.result = null;//FIX 
    DropboxClientFactory.revokeClient(callback); 
} 

을 그리고 그것은 작동합니다

나는 DropboxActivity 파일에 null로 정적 AuthActivity.result 변수를 설정 그것을 해결!

로그 아웃에 성공했습니다.

왜?

Auth.getOAuth2Token() 메소드는 로그 아웃했다하더라도 (DropboxClientFactory.revokeClient (콜백)) 로그인 활동의 결과를 반환합니다. 옵션은 해당 변수를 null로 설정하는 것입니다.

관련 문제