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>
Что я делаю не так и как я могу исправить?