보관 용 계정을 찾아보기 위해 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
클래스에서도 제거 할 수 없습니다. 이 문제를 해결하는 방법? 이 작업을 수행하는 더 좋은 방법이 있습니까?
명확하게하기 위해 "앱의 현재 세션에서 토큰을 시도하여 유효하지 않은 토큰을 반환합니다"라고 말하면 실패한 부분에 대해 코드와 결과 오류를 공유 할 수 있습니까? – Greg
'tokenRevoke' 메소드는 서버로 토큰을 취소하고'getOAuth2Token' 메소드는 단지 인증 활동에서 토큰을 검색합니다. 이미 지속성 ('SharedPreferences')에서 토큰을 제거하고있는 것처럼 보입니다. 그러나 메모리에 취소 된 토큰을 가진 기존 클라이언트를 버리지 않을 수 있다는 문제가있을 수 있습니다. – Greg
예. 'tokenRemove'는 서버의 토큰을 취소합니다. 그리고'SharedPreferences'에서 토큰을 제거합니다. 그러나 토큰을 버리는 방법은? Auth는 dropbox-api가 제공하는 클래스이며 기존 키를 버리는 정확한 방법을 제공하지 않습니다. 나는 드랍 - 박스 api에 새로운 종류입니다. – SysClaude