9

我打算创建一个第三方 fitbit 应用程序用于警报同步。

但是,我在注册我的应用程序时遇到了一些困难,即使我的客户已经注册到应用程序,也更明确地获取访问令牌。(考虑用户重新安装他的应用程序的场景)。

我正在使用 Chrome 自定义选项卡(因为 FitBit 禁止 WebView)来请求访问令牌:

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,它说以下内容:如果使用隐式授予流程的应用程序在先前颁发的访问令牌过期之前将用户发送到授权页面,除非范围增加,否则不会提示用户。用户将立即被重定向到带有访问令牌的应用程序。

所以我的问题是我对问题的思考是否存在错误,或者
我应该拦截的 chrome 自定义标签错误?

非常感谢您提前。

4

2 回答 2

6

我找到了解决此问题的方法。基本上,我在 URL 中插入了一个新参数,其中包含 Fitbit API 的查询。(“&提示=登录”)。此参数将在每次查询授权令牌时提示用户重新登录,如果已登录则将其注销。

于 2015-12-02T18:46:40.230 回答
0

所以我猜 fitbit 在用户已经登录时会执行 302 重定向。所以我使用了这个解决方案(将此解决方案与Chrome 选项卡演示中的 CustomTabActivityHelper 混合)并解决了这个问题。耶。

我能够通过在加载重定向的 url 之前调用 warmup 函数来“解决”这个问题。

Chrome 自定义标签重定向到 Android 应用程序将关闭该应用程序

于 2016-08-15T12:47:28.277 回答