onNewIntent никогда не вызывается - Android

Я пытаюсь создать простой поток oauth2, используя AppAuth. Я следую этому руководству по AppAuth. Он хорошо справляется с запросом oauth, но после авторизации, когда дело доходит до основной деятельности, он никогда не вызывает onNewIntent, я также проверил обсуждаемый вопрос здесь.

Редактировать: когда я использую метод onResume, после авторизации он переходит к методу onResume, но с действием "android.intent.action.MAIN". Где это должно происходить с действием "com.google.codelabs.appauth.HANDLE_AUTHORIZATION_RESPONSE" onResume.

Любое предложение, почему это происходит?

ниже приведен класс MainActivity

public class MainActivity extends AppCompatActivity {
    private static final String USED_INTENT = "USED_INTENT";
    public static final String LOG_TAG = "AppAuthSample";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void setupAuthorization(View view) {
        AuthorizationServiceConfiguration serviceConfiguration = new AuthorizationServiceConfiguration(
                Uri.parse("https://accounts.google.com/o/oauth2/v2/auth"), //* auth endpoint *//*,
                Uri.parse("https://oauth2.googleapis.com/token") //* token endpoint *//*
        );

        String clientId = "MY_ID.apps.googleusercontent.com";
        Uri redirectUri = Uri.parse("com.demo.testdriveapi:/oauth2callback");
        AuthorizationRequest.Builder builder = new AuthorizationRequest.Builder(
                serviceConfiguration,
                clientId,
                "code",
                redirectUri
        );
        builder.setScopes("https://www.googleapis.com/auth/drive.appdata");
        AuthorizationRequest request = builder.build();
        AuthorizationService authorizationService = new AuthorizationService(this);

        String action = "com.google.codelabs.appauth.HANDLE_AUTHORIZATION_RESPONSE";
        Intent postAuthorizationIntent = new Intent(action);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, request.hashCode(), postAuthorizationIntent, 0);
        authorizationService.performAuthorizationRequest(request, pendingIntent);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        checkIntent(intent);
    }    
 
    private void checkIntent(@Nullable Intent intent) {
        if (intent != null) {
            String action = intent.getAction();
            switch (action) {
                case "com.google.codelabs.appauth.HANDLE_AUTHORIZATION_RESPONSE":
                    if (!intent.hasExtra(USED_INTENT)) {
                        handleAuthorizationResponse(intent);
                        intent.putExtra(USED_INTENT, true);
                    }
                    break;
                default:
                    // do nothing
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        checkIntent(getIntent());
    }

    private void handleAuthorizationResponse(@NonNull Intent intent) {
        AuthorizationResponse response = AuthorizationResponse.fromIntent(intent);
        AuthorizationException error = AuthorizationException.fromIntent(intent);
        final AuthState authState = new AuthState(response, error);

        if (response != null) {
            Log.i(LOG_TAG, String.format("Handled Authorization Response %s ", authState.jsonSerializeString()));
            AuthorizationService service = new AuthorizationService(this);
            service.performTokenRequest(response.createTokenExchangeRequest(), new AuthorizationService.TokenResponseCallback() {
                @Override
                public void onTokenRequestCompleted(@Nullable TokenResponse tokenResponse, @Nullable AuthorizationException exception) {
                    if (exception != null) {
                        Log.w(LOG_TAG, "Token Exchange failed", exception);
                    } else {
                        if (tokenResponse != null) {
                            authState.update(tokenResponse, exception);
                            Log.i(LOG_TAG, String.format("Token Response [ Access Token: %s, ID Token: %s ]", tokenResponse.accessToken, tokenResponse.idToken));
                        }
                    }
                }
            });
        }
    }
}

Вот фрагмент из AndroidMenifest.xml

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.google.codelabs.appauth.HANDLE_AUTHORIZATION_RESPONSE"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

        <activity android:name="net.openid.appauth.RedirectUriReceiverActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="com.demo.testdriveapi"/>
            </intent-filter>
        </activity>
    </application>

а вот фрагмент activity_main.xml, у меня только одна кнопка

<Button
        android:id="@+id/buttonAuthorize"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="153dp"
        android:layout_marginTop="288dp"
        android:layout_marginEnd="170dp"
        android:onClick="setupAuthorization"
        android:text="Authorize"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

Редактировать: Также пытался использовать "android:launchMode="singleTop", но это тоже не работает.

Edit2: добавление снимка экрана консоли разработчика Google.

введите здесь описание изображения


person Karan    schedule 01.07.2020    source источник


Ответы (3)


проверьте панель инструментов Google Drive API для аутентификации oAuth, и ваше имя обратного вызова должно совпадать, и оно также должно быть зарегистрировано там. И именно с помощью этого обратного вызова ответ на авторизацию отправляется обратно в вашу активность.

person Dixit    schedule 04.07.2020
comment
В моей консоли API Google он не запрашивает URL-адрес обратного вызова. В разделе «Учетные данные» запрашивайте только имя, имя пакета и SHA1. Где разместить URL обратного вызова? - person Karan; 05.07.2020
comment
при создании раздела OAuth в консоли API. для OAuth запрашивает обратный вызов. Когда ваш клиентский ключ мог быть сгенерирован, посмотрите на эту страницу. Я уверен, что будет какой-то обратный вызов, который мог бы быть заполнен. - person Dixit; 05.07.2020
comment
Посмотрите на это и осмотритесь, вы получите решение, необходимое для установки обратного вызова. Надеюсь, это поможет developers.google.com/tasks/ - person Dixit; 05.07.2020
comment
Здравствуйте, еще раз спасибо, но я думаю, что Google изменил это. Вы недавно пытались создать учетные данные OAuth2? Потому что он предоставляет вам возможность RedirectUri, когда вы выбираете веб-приложение на консоли, а не при использовании опции Android. Однако, когда я загружаю JSON для учетных данных, которые я создал для Android, он показывает перенаправление Uris в этом файле. Я пробовал оба безуспешно, т.е. redirect_uris:[ urn:ietf:wg:oauth:2.0:oob, ​​localhost] - person Karan; 05.07.2020
comment
Я добавил изображение того, что я вижу в консоли разработчика Google для справки. Пожалуйста, посмотрите. Заранее спасибо. - person Karan; 05.07.2020

Похоже, что net.openid:appauth:0.7.1 глючит. Я наткнулся на этот вопрос, затем я изменил моя версия до 0.2.0, и это сработало.

person Karan    schedule 08.07.2020
comment
вся библиотека оказалась кошмаром для работы, документы несколько сложны для понимания, а также не хватает примеров. Мне пришлось обойти несколько вещей - person Chief; 20.07.2020
comment
Здравствуйте @Chief, если у вас есть свои работы где-то в Интернете, поделитесь, пожалуйста. - person Karan; 20.07.2020

Если я вас правильно понял, вы успешно настроили AppAuth и при запуске механизма аутентификации пользователь может ввести свое имя пользователя и пароль для входа в openId или что-то еще. Но при этом вы не можете перехватить результат этого намерения (настраиваемые вкладки Chrome).

Если это так, попробуйте этот метод переопределения

onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)

вам также нужно startActivityForResult(authIntent, REQUEST_CODE)

person Chief    schedule 19.07.2020
comment
Да, но я хочу сделать это явным намерением, а не неявным. Код по-прежнему имеет проблему с получением токена после получения кода аутентификации. - person Karan; 20.07.2020