Получение unauthorized_client при доступе к Google Drive API с помощью serverAuthCode
Я пишу приложение, в котором мы выполняем вход пользователя из приложения Android с помощью Google SDK следующим образом
gso = getGoogleSignInOptions();
mGoogleApiClient = getGoogleApiClient(this, this);
SignInButton mSignInButton = (SignInButton) findViewById(R.id.sign_in_button);
mSignInButton.setSize(SignInButton.SIZE_WIDE);
mSignInButton.setScopes(gso.getScopeArray());
mSignInButton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onClick(View v) {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
}
);
private Scope AUTH_DRIVE = new Scope("https://www.googleapis.com/auth/drive");
public GoogleSignInOptions getGoogleSignInOptions() {
Scope scope = new Scope(Scopes.PROFILE);
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(Constants.serverClientID)
.requestServerAuthCode(Constants.serverClientID)
.requestScopes(scope, new Scope[]{AUTH_DRIVE})
.build();
return gso;
}
public GoogleApiClient getGoogleApiClient(AppCompatActivity activity, GoogleApiClient.OnConnectionFailedListener listener) {
this.activity = activity;
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this.activity, listener)
.addApi(Auth.GOOGLE_SIGN_IN_API, getGoogleSignInOptions())
.addApi(Drive.API)
.build();
return mGoogleApiClient;
}
И обрабатывать результат входа в систему, как это
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.wtf(TAG, "onactivity result");
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
Toast.makeText(getApplicationContext(), "Signed In!", Toast.LENGTH_LONG).show();
userAccount = result.getSignInAccount();
String gCode = userAccount.getServerAuthCode();
Log.wtf(TAG, "gcode = "+userAccount.getServerAuthCode());
Log.wtf(TAG, "token = "+userAccount.getIdToken());
if (userAccount != null) {
signUp(convertNull(userAccount.getDisplayName()), convertNull(userAccount.getEmail()), null, convertNull(userAccount.getId()), null, convertNull(userAccount.getId()), convertNull("Android"), convertNull(userAccount.getIdToken()), gCode);
}
} else {
Log.wtf(TAG, "msg = " + result.getStatus().getStatusMessage());
Log.wtf(TAG, result.getStatus().getStatusCode());
}
}
Теперь мы получаем ServerAuthCode и ID-токен в порядке, и они также хорошо загружаются на наш бэкэнд-сервер.
Но когда я пытаюсь получить доступ к Google Drive API, используя код, который я нашел на сайте Google
OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
APPLICATION_NAME = 'AppName'
CLIENT_SECRETS_PATH = 'client_secret.json'
CREDENTIALS_PATH = File.join(Dir.home, '.credentials',
"drive-ruby-quickstart.yaml")
SCOPE = Google::Apis::DriveV3::AUTH_DRIVE
FOLDER_NAME = "AppName"
@service = nil
def authorize(user_id, code)
FileUtils.mkdir_p(File.dirname(CREDENTIALS_PATH))
client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)
authorizer = Google::Auth::UserAuthorizer.new(
client_id, SCOPE, token_store)
#user_id = 'default'
credentials = authorizer.get_credentials(user_id)
#credentials = nil
if credentials.nil?
url = authorizer.get_authorization_url(
base_url: OOB_URI)
puts "Open the following URL in the browser and enter the resulting code after authorization"
puts url
credentials = authorizer.get_and_store_credentials_from_code(user_id: user_id, code: code, base_url: OOB_URI)
else
puts "credentials is not nil"
end
credentials
end
Мы получаем следующую ошибку
{
"error": "unauthorized_client",
"error_description": "Unauthorized"
}
Может кто-нибудь помочь мне узнать, почему я получаю эту ошибку? Я бился головой об этом больше недели.