我打算为警报同步创建第三方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));
重定向到使用intent-filter定义的自定义方案时:
<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自定义标签错误?
非常感谢你。
答案 0 :(得分:5)
我找到了解决此问题的方法。 基本上我在Url中插入一个新参数,其中包含Fitbit API的查询。 (“&amp; prompt = login”)。此参数将提示用户每次查询授权令牌时重新登录,如果已登录则将其注销。
答案 1 :(得分:0)
所以我猜想当用户已登录时,fitbit会进行302重定向。所以我使用了这个解决方案(将此解决方案与来自Chrome tab demo的CustomTabActivityHelper混合)并修复了问题。耶。
之前通过调用预热功能我能够“修复”这个问题 加载重定向的网址。
Chrome Custom Tabs redirect to Android app will close the app