redirect_url ошибка обратного вызова Strava API

Я использую Strava API, аутентификацию по протоколу OAuth2, использую библиотеку Scribe. Аутентификация происходит в методе onCreate() объекта MainActivity.

Тестовое приложение использует два класса рядом с MainActivity. StravaOAuth20ServiceImpl предназначен для настройки запросов API на токен и отзыва токена. StravaOAuth2Api содержит конечные точки для API.

Вот код для StravaOAuth20ServiceImpl:

public class StravaOAuth20ServiceImpl extends OAuth20Service {

    StravaOAuth20ServiceImpl(DefaultApi20 api, OAuthConfig config) {
        super(api, config);
    }

    @Override
    protected OAuthRequest createAccessTokenRequest(String code) {
        //System.out.println(getApi().getAccessTokenEndpoint());

        OAuthRequest request = new OAuthRequest(Verb.POST, getApi().getAccessTokenEndpoint());
        OAuthConfig config = this.getConfig();
        request.addParameter("client_id", config.getApiKey());
        request.addParameter("client_secret", config.getApiSecret());
        request.addParameter("code", code);
        request.addParameter("redirect_uri", config.getCallback());

        return request;
    }

    @Override
    protected OAuthRequest createRevokeTokenRequest(String tokenToRevoke, TokenTypeHint tokenTypeHint) {
        OAuthRequest request = new OAuthRequest(Verb.POST, getApi().getRevokeTokenEndpoint());
        request.addParameter("token",tokenToRevoke);

        return request;
    }
}

Вот код для StravaOAuth2Api:

public class StravaOAuth2Api extends DefaultApi20 {

    @SuppressWarnings("WeakerAccess")
    protected StravaOAuth2Api() {}

    private static class InstanceHolder {
        private static final StravaOAuth2Api INSTANCE = new StravaOAuth2Api();
    }

    @SuppressWarnings("WeakerAccess")
    public static StravaOAuth2Api instance() {
        return InstanceHolder.INSTANCE;
    }

    @Override
    protected String getAuthorizationBaseUrl() {
        return "https://www.strava.com/oauth/authorize";
    }

    @Override
    public String getAccessTokenEndpoint() {
        return "https://www.strava.com/oauth/token";
    }

    @Override
    public String getRevokeTokenEndpoint() {
        return "https://www.strava.com/oauth/deauthorize";
    }

    @Override
    public OAuth20Service createService(OAuthConfig config) {
        return new StravaOAuth20ServiceImpl(this, config);
    }
}

И MainActivity:

public class MainActivity extends AppCompatActivity {

    //apiKey in Scribe corresponds to client_id
    public String apiKey = "xxx";
    //apiSecret in Scribe corresponds to client_secret
    public String apiSecret = "xxxxxx";
    public OAuth20Service service = new ServiceBuilder(apiKey)
            .apiSecret(apiSecret)
            .callback("coachingcallback")
            .build(StravaOAuth2Api.instance());
    public Scanner in = new Scanner(System.in);
    private String TAG = "tralala";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String authorizationurl = service.getAuthorizationUrl();
        Log.d(TAG, authorizationurl);
        final String code = in.nextLine();

        try {
            final OAuth2AccessToken accessToken = service.getAccessToken(code);
            Log.d(TAG, accessToken.getRawResponse());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

Я получаю NoSuchElementException при попытке прочитать входные данные со сканера. Так что я не получаю код обратно. По моему мнению, это потому, что redirect_url настроен неправильно или я делаю ошибку в моем файле манифеста.

В разделе разработчиков Strava приложения я поместил redirect_url приложения как "coachingcallback". Мне не разрешено использовать "/" там. В манифесте я обязан указать схему, поэтому я установил ее на "http".

Мой файл манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gebruiker.stravaapitest">

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:host="coachingcallback"
                    android:scheme="http"/>
            </intent-filter>
        </activity>
    </application>

</manifest> 

Что я делаю не так и как я могу исправить?

0 ответов

Другие вопросы по тегам