このクライアントアプリケーションのエラーレコードに対してTwitterログインコールバックURLが承認されていません

私が作ったアプリは海外版だったので、この2日間で突然Twitterログインに失敗したと言って、いろいろな理由と解決策を確認し、最終的に解決して2つの解決策を提供しました。

Twitterのボスが承認と認証のメカニズムを更新しましたが、アプリケーションのバックエンドが更新されなかったため、ログインの問題が広範囲に発生し、非常に崩壊しました!

問題の説明

Twitterクライアントが携帯電話にインストールされている場合は効果がありません。インストールされていない場合はログイン失敗を促し、ログインできません。

さらに面倒なことをせずに、電話に接続してログを読み取ります。

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) 

以下に文字列がありますが、これが主な理由なので、以下では読みません。分析中、jsonの解析は失敗しましたが、通常は成功しましたが、xmlコードの文字列が返されますが、もちろん失敗しました。次に、問題はxmlの間違った説明です。
このクライアントアプリケーションで承認されていないコールバックURL。承認されたコールバックURLは、アプリケーション設定で調整できます
。これが問題です。TwitterアプリケーションのバックグラウンドでのコールバックURL設定に問題がありますが、これはまったく移動されていません。なぜ突然機能しなくなるのですか?

解答を見つける

Twitterが何かをしているかどうかを確認しますか?案の定、5月にTwitterがアナウンスを発行し、Twitterでログインするユーザーに注意を促していることがわかりました。引き続きTwitterでログインする必要がある場合は、アプリのバックグラウンドでホワイトリストにコールバックURLを追加する必要があります。解決策はここにあります。何を記入しますか?実を言うと、ツイッターの関係者はそれを明らかにしておらず、最近どこでも質問があります。

ここに写真の説明を書いてください

期間中、さまざまなブログ、コミュニティ、公式ウェブサイトがコールバックURLを記述し、アクセス可能なアドレスを入力するだけでした。公式の統合android-kitに従ってウェーブも作成しましたが、それでも機能せず、同じエラーが発生します。崩壊。

解決策1

最後にコールバックURLに1問題を発見し、[OK]をホワイトリストURL Twitterの公式を使用して、当社のアプリケーションの背景に記入するように言われて
、それについては次のとおりです。twittersdk://
このように充填した後:
ここに写真の説明を書いてください

このように、クライアントは何も移動して通常どおり使用し続ける必要はありません。

解決策2

別の解決策、この変更は大きく、クライアントコードを更新する必要があります。緊急性のため、Waveについても学び、それを受け取るためのデモを作成しました(その後、最初の解決策を見つけ、数分で戻ってきました。リターンコード)。

この解決策は、TwitterのAuth認証APIを使用してページを直接ロードすることです。はい、自分でロードします。
Twitter開発者の公式ウェブサイトのapiには、認証用のapiインターフェイスがあります。
ここに写真の説明を書いてください
パラメータはoauth_token であり、渡す必要があり、
最終的にアセンブルされるのは、このようなURLとページです。
ここに写真の説明を書いてください

したがって、ロードする必要があるのはこのページです。このアドレスをロードするためにwebViewを作成するだけです。
最後に、トークンを取得する方法については、コードを直接アップロードしてください。

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

このように、認証ページに入り、WebviewClientで監視することもできます。ログイン後に認証ページに入ると、Twitterを使用してユーザー情報を取得する別の方法を提供できます。

accessToken = mTwitter.getOAuthAccessToken(requestToken, strVerifier);

requestTokenは、以前に取得したトークンとstrVerifierです。URLから取得します。認証Webページへのリンクにoauth_verifierというパラメーターがあります。このパラメーターはuri.getQueryParameter( "oauth_verifier")から取得します。

これはネットワーク操作であり、時間がかかることに注意してください。

最後に、AccessTokenの情報はTwitterユーザーの情報です。
ここに写真の説明を書いてください

ピットレコードを踏んで、皆様のお役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/lizebin_bin/article/details/80707733