1

Google 드라이브 Android API를 사용하여 사용자가 Android 기기의 Google 드라이브에서 내 서버로 파일을 업로드 할 수있게했습니다. 크로스 클라이언트 인증을 사용하여 서버가 사용자의 Google 드라이브에 직접 액세스 할 수 있도록이 설정을 변경하고자합니다. 즉, 을 GoogleAuthUtil.getToken으로 생성해야합니다. 그리고 이것은 모든 것이 철저히 벗어났다는 것입니다. 이 토큰을 생성하려면 Account 개체가 필요합니다.Google 드라이브 Android API 및 교차 클라이언트 인증

mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
    .addApi(Drive.API) 
    .addScope(Drive.SCOPE_FILE) 
    .addConnectionCallbacks(this) 
    .addOnConnectionFailedListener(this) 
    .build(); 

이 잘 작동, 모든 이제 다음은 사용자가 연결 계정을 선택할 수있는 계정 선택기 보여줍니다

현재,이 같은 GoogleApiClient를 설정하고있다. 모두 프레임 워크에 의해 관리됩니다. 그러나 사용자가 연결하기로 선택한 Account에 액세스 할 수있는 방법은 없습니다.

는 대신, 사용, 그것을 자신을 관리 할 수 ​​있습니다

Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"}, 
    false, null, null, null, null); 
startActivityForResult(intent, RC_ACCOUNT_PICKER); 

그리고 onActivityResult에 내가 사용 선택한 계정을 얻을 수 있습니다 : 내가 Account 목적이 있기 때문에, 지금

Account account = new Account(intent.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME), 
    intent.getExtras().getString(AccountManager.KEY_ACCOUNT_TYPE)); 

과, 나는 그것을 명시 적으로 연결할 수 있습니다 :

mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
    .addApi(Drive.API) 
    .addScope(Drive.SCOPE_FILE) 
    .setAccountName(mAccount.name) // Account name! 
    .addConnectionCallbacks(this) 
    .addOnConnectionFailedListener(this) 
    .build(); 

이것은 내 유일한 optio입니까? n, 내 첫 번째 솔루션을 사용하여 사용자가 Account을 선택할 수있는 방법이 있습니까?

- 나중에

생성 할 때 내 ID Token 사용 : 난 아직도 비록, 내가 사용자로부터 또 다른 권한을 부여 받아야합니다 UserRecoverableAuthException납니다

String scope = String.format("oauth2:server:client_id:%s:api_scope:%s", 
    "12345.apps.googleusercontent.com", 
    "https://www.googleapis.com/auth/drive.file"); 
String token = GoogleAuthUtil.getToken(getContext(), mAccount, scope); 

내가 연결할 때와 같은 계정과 동일한 인증 범위를 사용하고 있습니다. 모든 조치가 완료되면 동일한 코드를 다시 실행하고 마침내 ID Token을 얻을 수 있습니다.

-

뭔가 내가 근본적으로 오해가 한 경우, 또는이는이 일을 해야하는 방법을 정말?

답변

3

해당 토큰을 서버에 전달하는 것이 안전하지 않으므로 this blog post에서 설명한대로 GoogleAuthUtil.getToken()을 더 이상 사용하지 마십시오.

대신 Enable Server-Side AccessGoogle Sign In을 통해 사용하고 requestServerAuthCode() method을 사용해야합니다.

이 사용자에게 메시지를 두 번 피할 수는 GET_ACCOUNTS 권한을 사용하고, 당신에게 로그인을위한 단일 사용자 흐름을 제공하지 않습니다.

+0

내가 질문을 할 수 있습니까? 블로그 사이트에서'일반적으로 안드로이드 클라이언트에서 REST API 호출을하지 않는 한 GoogleAuthUtil.getToken을 사용하면 안됩니다. 제대로 이해한다면'GoogleAuthUtil.getToken'은 요청이 계속해서 안전하게 사용될 수 있음을 의미합니다 안드로이드 앱에서 직접 호출되는 REST API (서버없이)? – BNK

+0

로컬로 ID 토큰을 사용하려면 [id 토큰 흐름] (https://developers.google.com/identity/sign-in/android/migration-guide # migrate_to_the_id_token_flow)를 사용하고 'requestIdToken()'을 사용하여 단일 사인온의 이점을 얻으십시오. – ianhanniballake

+0

그러나이 경우 'GoogleAuthUtil.getToken' 보안이 유지됩니까? 또한 '사용자의 ID, 이메일 주소, 이름 또는 프로필 사진 URL'을 가져 오는 데만 사용되는 id 토큰은 Google 드라이브, YouTube 또는 연락처와 같은 다른 Google API에 액세스하는 데 사용되지 않습니다. – BNK