URL de retorno de chamada de login do Twitter não aprovado para este registro de erro de aplicativo cliente

Como o aplicativo que fiz era para versões internacionais, de repente disse que o login do Twitter falhou nos últimos dois dias. Verifiquei vários motivos e soluções, finalmente resolvi e apresentei duas soluções.

O chefe do Twitter atualizou o mecanismo de autorização e autenticação, e o back-end do aplicativo não foi atualizado, o que causou uma grande área de problemas de login, que foi muito reduzida!

Descrição do Problema

Se o cliente Twitter estiver instalado no telefone celular, ele não terá efeito. Se não estiver instalado, ele solicitará uma falha de login e não poderá fazer login.

Sem mais delongas, conecte-se ao telefone para ler o 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) 

Há uma string abaixo, mas esse é o motivo principal, então não vou ler abaixo. Durante a análise, a análise json falhou. Normalmente, foi bem-sucedida. Agora uma string de código xml é retornada, o que obviamente falhou. Então o problema é a descrição errada no xml.
URL de retorno de chamada não aprovado para este aplicativo cliente. URLs de retorno de chamada aprovados podem ser ajustados nas configurações do seu aplicativo
. Este é o problema. Há um problema com a configuração do URL de retorno no plano de fundo do aplicativo do Twitter, mas isso não foi movido. Por que ele para de funcionar repentinamente?

Achar uma solução

Verificar se o Twitter está fazendo alguma coisa? Com certeza, finalmente descobri que o Twitter emitiu um anúncio em maio, lembrando os usuários que fazem login usando o Twitter. Se eles precisarem continuar fazendo login usando o Twitter, eles precisam adicionar o URL de retorno de chamada à lista de permissões no plano de fundo do aplicativo. OK, a solução está aí, no final O que preencher? Para dizer a verdade, os funcionários do Twitter não deixaram isso claro e tem havido perguntas em todos os lugares atualmente. . . . .

Escreva a descrição da imagem aqui

Durante o período, vários blogs, comunidades e sites oficiais descreveram o Callback URL e apenas preencher um endereço que possa ser acessado.Também escrevi um wave de acordo com o android-kit oficial integrado, mas ainda não funciona, mesmo erro. colapso.

Solução 1

Finalmente encontrei um problema em um URL de retorno de chamada, é dito ser url oficial do Twitter, use-o para preencher nossa lista de permissões de plano de fundo do aplicativo. O ok
para isso é: twittersdk: //
Depois de preencher assim:
Escreva a descrição da imagem aqui

Desta forma, o cliente não precisa mexer em nada e continuar a usá-lo normalmente.

Solução 2

Outra solução, essa mudança é grande, e o código do cliente precisa ser atualizado. Por causa da urgência, também aprendi sobre a onda e escrevi uma demonstração para recebê-la (aí encontrei a primeira solução e voltei em minutos Código de retorno).

Esta solução é usar a API de autorização Auth do Twitter para carregar a página diretamente, sim, carregue-a você mesmo.
Há uma interface de API para autenticação na api do site oficial do desenvolvedor do Twitter. O
Escreva a descrição da imagem aqui
parâmetro é um oauth_token que deve ser passado e
finalmente montado em um URL e uma página.
Escreva a descrição da imagem aqui

Então, o que precisamos carregar é esta página, basta escrever um webView para carregar este endereço!
Por fim, como obter o token, faça upload do código diretamente:

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();

Dessa forma, você também pode entrar na página de autorização e, em seguida, ouvir em WebviewClient.Quando você entra na página de autorização após fazer o login, você pode fornecer outro método para obter informações do usuário através do Twitter.

accessToken = mTwitter.getOAuthAccessToken(requestToken, strVerifier);

O requestToken é o token e o strVerifier que obtivemos antes. Nós o obtemos do url. Há um parâmetro no link para a página da Web de autorização chamado oauth_verifier . Obtemos esse parâmetro por meio de uri.getQueryParameter ("oauth_verifier").

Observe que esta é uma operação de rede demorada.

Finalmente, as informações no AccessToken são as informações dos usuários do Twitter.
Escreva a descrição da imagem aqui

Pisando no registro das boxes, espero ajudar a todos.

Acho que você gosta

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