Пользовательские вкладки Android Chrome / веб-API Fitbit не будут перенаправлять, если приложение уже авторизовано. (OAuth2.0)

Я намерен создать стороннее приложение 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 должен запуститься, где я получу свой AccessToken из данного Intent:

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 будут открываться и оставаться на пустой странице (очевидно, она не будет правильно перенаправлена).

Я прочитал веб-API FitBit, и в нем говорится следующее: если приложение, использующее поток неявного предоставления, отправляет пользователя на страницу авторизации до истечения срока действия ранее выданного токена доступа, пользователю не будет предложено, если область действия не увеличилась. Пользователь будет немедленно перенаправлен в приложение с токеном доступа.

Итак, мой вопрос: есть ли ошибка в моих размышлениях о проблеме или
ошибка пользовательских вкладок Chrome, которую я должен перехватить?

Заранее большое спасибо.


person Buruiană Cătălin    schedule 19.11.2015    source источник
comment
Я также столкнулся с той же проблемой, очень разочаровывающей поддержкой от fitbit. Я бы сказал, что они написали хорошую документацию, не изучая поведение пользовательских вкладок Chrome.   -  person pyus13    schedule 30.11.2015


Ответы (2)


Я нашел обходной путь для этой проблемы. В основном я вставляю новый параметр в URL-адрес с запросом для API Fitbit. ("&prompt=логин"). Этот параметр будет предлагать пользователю повторно войти в систему каждый раз, когда он запрашивает токен авторизации, выходя из системы, если он уже вошел в систему.

person Buruiană Cătălin    schedule 02.12.2015
comment
У вас есть код в Git Hub? Я столкнулся с такой же проблемой, и я хотел бы взглянуть на вашу, если это возможно - person Dany19; 11.04.2016
comment
да @Dany19 на самом деле у меня есть макет: github.com/Loopiezlol/FitBitTester - person Buruiană Cătălin; 21.04.2016
comment
@Buruiană Cătălin: как получить код после того, как пользователь нажмет «Разрешить»? - person D T; 09.03.2018

Итак, я предполагаю, что fitbit выполняет перенаправление 302, когда пользователь уже вошел в систему. Поэтому я использовал это решение (смешанное это решение с CustomTabActivityHelper из демонстрация вкладки Chrome ), и это устранило проблему. Ура.

Я смог «исправить» проблему, вызвав функцию прогрева перед загрузкой URL-адреса, который перенаправляет.

Перенаправление пользовательских вкладок Chrome в приложение Android закроет приложение

person Gaurav Vashisth    schedule 15.08.2016