Получение 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"
}

Может кто-нибудь помочь мне узнать, почему я получаю эту ошибку? Я бился головой об этом больше недели.

0 ответов

Другие вопросы по тегам