La URL de devolución de llamada de inicio de sesión de Twitter no está aprobada para este registro de error de la aplicación del cliente

Debido a que la aplicación que hice era para la versión en el extranjero, de repente dije que el inicio de sesión de Twitter falló en los últimos dos días. Verifiqué varias razones y soluciones, y finalmente lo resolví y proporcioné dos soluciones.

El jefe de Twitter actualizó el mecanismo de autorización y autenticación, y el backend de la aplicación no se actualizó, lo que provocó una gran área de problemas de inicio de sesión, ¡que colapsó!

Descripción del problema

Si el cliente de Twitter está instalado en el teléfono móvil, no tiene ningún efecto. Si no está instalado, provocará un error de inicio de sesión y no podrá iniciar sesión.

Sin más preámbulos, conéctese al teléfono para leer el registro:

06-15 16:22:25.734 1015-1015/com.example.testlogin E/Twitter: Invalid json: <?xml version="1.0" encoding="UTF-8"?><errors><error code="415">Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings</error></errors>
                                                              com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
                                                                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
                                                                  at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45)
                                                                  at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:887)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:852)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:801)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:773)
                                                                  at com.twitter.sdk.android.core.TwitterApiException.parseApiError(TwitterApiException.java:110)
                                                                  at com.twitter.sdk.android.core.TwitterApiException.readApiError(TwitterApiException.java:95)
                                                                  at com.twitter.sdk.android.core.TwitterApiException.<init>(TwitterApiException.java:43)
                                                                  at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42)
                                                                  at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
                                                                  at android.os.Handler.handleCallback(Handler.java:751)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                  at android.os.Looper.loop(Looper.java:154)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
                                                               Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
                                                                  at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
                                                                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
                                                                  at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45) 
                                                                  at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45) 
                                                                  at com.google.gson.Gson.fromJson(Gson.java:887) 
                                                                  at com.google.gson.Gson.fromJson(Gson.java:852) 
                                                                  at com.google.gson.Gson.fromJson(Gson.java:801) 
                                                                  at com.google.gson.Gson.fromJson(Gson.java:773) 
                                                                  at com.twitter.sdk.android.core.TwitterApiException.parseApiError(TwitterApiException.java:110) 
                                                                  at com.twitter.sdk.android.core.TwitterApiException.readApiError(TwitterApiException.java:95) 
                                                                  at com.twitter.sdk.android.core.TwitterApiException.<init>(TwitterApiException.java:43) 
                                                                  at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42) 
                                                                  at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68) 
                                                                  at android.os.Handler.handleCallback(Handler.java:751) 
                                                                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                  at android.os.Looper.loop(Looper.java:154) 
                                                                  at android.app.ActivityThread.main(ActivityThread.java:6776) 
                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518) 
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) 

Hay una cadena a continuación, pero esta es la razón principal, por lo que no la leeré a continuación. Bajo el análisis, el análisis json falló. Normalmente, fue exitoso. Ahora se devuelve una cadena de código xml, que por supuesto falló. Entonces el problema es la descripción incorrecta en el xml.
La URL de devolución de llamada no está aprobada para esta aplicación cliente. Las URL de devolución de llamada aprobadas se pueden ajustar en la configuración de la aplicación
. Este es el problema. Hay un problema con la configuración de la URL de devolución de llamada en el fondo de la aplicación de Twitter, pero esto no se ha movido en absoluto. ¿Por qué deja de funcionar repentinamente?

Encuentra una solución

¿Comprobar si Twitter está haciendo algo? Efectivamente, finalmente descubrí que Twitter emitió un anuncio en mayo, recordando a los usuarios que inician sesión usando Twitter. Si necesitan continuar ingresando usando Twitter, deben agregar la URL de devolución de llamada a la lista blanca en el fondo de la aplicación. De acuerdo, la solución está ahí, al final ¿Qué llenar? A decir verdad, los funcionarios de Twitter no lo han dejado claro, y ha habido preguntas en todas partes estos días. . . . .

Escriba la descripción de la imagen aquí

Durante el período, varios blogs, comunidades y sitios web oficiales describieron la URL de devolución de llamada y simplemente ingresaron una dirección a la que se puede acceder. También escribí una ola de acuerdo con el kit de Android integrado oficial, pero aún no funciona, el mismo error. colapso.

Solución 1

Finalmente encontré un problema en una URL de devolución de llamada, se dice que es la URL oficial de Twitter, úsela para completar la lista blanca de antecedentes de nuestra aplicación, el ok
es: twittersdk: //
Después de completarlo así:
Escriba la descripción de la imagen aquí

De esta forma, el cliente no necesita mover nada y seguir usándolo con normalidad.

Solucion 2

Otra solución, este cambio es grande y el código del cliente debe actualizarse. Debido a la urgencia, también aprendí sobre la ola y escribí una demostración para recibirla (luego encontré la primera solución y regresé en minutos Código de retorno).

Esta solución es utilizar la API de autorización de autenticación de Twitter para cargar la página directamente, sí, cárguela usted mismo.
Hay una interfaz de API para la autenticación en la API del sitio web oficial del desarrollador de Twitter. El
Escriba la descripción de la imagen aquí
parámetro es un oauth_token que debe pasarse y
finalmente ensamblarse es una URL y una página.
Escriba la descripción de la imagen aquí

Entonces, lo que necesitamos cargar es esta página, ¡solo escriba un webView para cargar esta dirección!
Finalmente, cómo obtener el token, cargue directamente el código:

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(KEY);
configurationBuilder.setOAuthConsumerSecret(SECRET);
Configuration configuration = configurationBuilder.build();
mTwitter = new TwitterFactory(configuration).getInstance();
   new Thread(new Runnable() {
      @Override
      public void run() {
        try {
            requestToken = mTwitter.getOAuthRequestToken();
            runOnUiThread(new Runnable() {
               @Override
               public void run() {
                  webView.loadUrl(requestToken.getAuthenticationURL());
                  }
              });
           }catch (twitter4j.TwitterException e) {
              e.printStackTrace();
         }
      }
}).start();

De esta manera, también puede ingresar a la página de autorización, y luego escuchar en WebviewClient.Cuando ingresa a la página de autorización después de iniciar sesión, puede proporcionar otro método para obtener información del usuario a través de Twitter.

accessToken = mTwitter.getOAuthAccessToken(requestToken, strVerifier);

El requestToken es el token y strVerifier que obtuvimos antes. Lo obtenemos de la url. Hay un parámetro en el enlace a la página web de autorización llamado oauth_verifier . Obtenemos este parámetro a través de uri.getQueryParameter ("oauth_verifier").

Tenga en cuenta que esta es una operación de red y requiere mucho tiempo.

Finalmente, la información en AccessToken es la información de los usuarios de Twitter.
Escriba la descripción de la imagen aquí

Al pisar el récord de boxes, espero ayudar a todos.

Supongo que te gusta

Origin blog.csdn.net/lizebin_bin/article/details/80707733
Recomendado
Clasificación