9

アラーム同期用のサードパーティの fitbit アプリを作成するつもりです。

ただし、クライアントが既にアプリに登録されている場合でも、アプリの登録に関していくつかの問題が発生しました。より明示的にアクセストークンを取得することです。(ユーザーが自分のアプリケーションを再インストールするというシナリオを考慮して)。

アクセストークンをリクエストするためにChromeカスタムタブを使用しています(WebViewはFitBitで禁止されているため):

String url = "https://www.fitbit.com/oauth2/authorize?" +
                    "response_type=token" +
                    "&client_id=XXXXXX" +
                    "&scope=activity"+
                    "&redirect_uri=fitbittester://logincallback";
            customTabsIntent.launchUrl(MainActivity.this, Uri.parse(url));

インテント フィルターで定義されたカスタム スキームにリダイレクトすると、次のようになります。

<activity
        android:name=".TestActivity"
        android:label="TestActivity"
        android:theme="@style/AppTheme.NoActionBar">
        <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="fitbittester" android:host="logincallback" />
        </intent-filter>
    </activity>

TestActivity が起動し、指定された Intent から AccessToken を取得します。

public class TestActivity extends AppCompatActivity {

String string;

@Override
protected void onNewIntent(Intent intent) {
    string = intent.getDataString();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    onNewIntent(getIntent());
    Toast.makeText(TestActivity.this, string , Toast.LENGTH_LONG).show();
    Log.e("TAG", string);
    Log.e("TAG", string.substring(string.indexOf("&access_token")+14));
}

}

最初の実行ではすべてが正常に機能しますが (クライアントがまだ承認されていないという事実を前提として)、その後、アクセストークンを再度取得したい場合 (ローカルに保存する必要があることはわかっています - SharedPreferences が最も可能性が高いですが、これはテスト目的のためですのみ) chrome カスタム タブが開いて、空のページにとどまります (明らかに、適切にリダイレクトされません)。

FitBit WEB API を読みましたが、次のように書かれています: 以前に発行されたアクセス トークンの有効期限が切れる前に、暗黙的許可フローを使用するアプリケーションがユーザーを認証ページに送信した場合、スコープが拡大されない限り、ユーザーはプロンプトを表示されません。ユーザーは、アクセス トークンを使用してすぐにアプリケーションにリダイレクトされます。

だから私の質問は、問題についての私の考えに誤りがあるのか
​​ 、それともクロムのカスタムタブの誤りがあるのか​​ということです。

事前にどうもありがとうございました。

4

2 に答える 2

6

この問題の回避策を見つけました。基本的に、Fitbit API のクエリを使用して、Url に新しいパラメーターを挿入しています。( "&prompt=login" ) . このパラメーターは、認証トークンを照会するたびにユーザーに再ログインを促し、既にログインしている場合はログアウトします。

于 2015-12-02T18:46:40.230 に答える
0

したがって、ユーザーが既にログインしている場合、fitbit は 302 リダイレクトを行うと思います。したがって、このソリューションを使用し (このソリューションをChrome タブ demoの CustomTabActivityHelper と混合)、問題を修正しました。わーい。

リダイレクトする URL をロードする前にウォームアップ関数を呼び出すことで、問題を「修正」することができました。

Chrome カスタム タブが Android アプリにリダイレクトすると、アプリが閉じます

于 2016-08-15T12:47:28.277 に答える