Пользовательские вкладки Android Chrome / веб-API Fitbit не будут перенаправляться, если приложение уже авторизовано. (OAuth2.0)
Я собираюсь создать стороннее приложение для синхронизации сигналов тревоги.
Однако я столкнулся с некоторыми трудностями, связанными с регистрацией моего приложения, более конкретно при получении токена доступа, даже если мой клиент уже зарегистрирован в приложении. (Учитывая сценарий, когда пользователь переустанавливает свое приложение).
Я использую пользовательские вкладки 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, где я получу свой 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 откроются и останутся на пустой странице (по-видимому, они не будут правильно перенаправлены).
Я прочитал WEB API FitBit и он говорит следующее: Если приложение, использующее поток неявного предоставления, отправляет пользователя на страницу авторизации до истечения срока действия ранее выданного токена доступа, пользователю не будет предложено до тех пор, пока область не увеличится. Пользователь будет сразу же перенаправлен в приложение с токеном доступа.
Так что мой вопрос, есть ли ошибка в моем мышлении о проблеме или
я не могу перехватить пользовательские вкладки Chrome?
Заранее большое спасибо.
2 ответа
Я нашел решение этой проблемы. В основном я вставляю новый параметр в URL с запросом для API Fitbit. ( "&prompt=login") . Этот параметр будет предлагать пользователю повторно входить в систему каждый раз, когда он запрашивает токен авторизации, выходя из него, если он уже вошел в систему.
Так что я думаю, что fitbit выполняет перенаправление 302, когда пользователь уже вошел в систему. Поэтому я использовал это решение (смешал это решение с CustomTabActivityHelper из демо-версии вкладки Chrome), и это устранило проблему. Ура.
Я смог "исправить" проблему, вызвав функцию разминки перед загрузкой URL, который перенаправляет.
Перенаправление Chrome Custom Tabs в приложение Android закроет приложение