Я пытаюсь создать мобильное приложение, которое входит в систему, используя OAuth2. Я следую этому уроку здесь , но изменил некоторые его части.
Краткое описание моей проблемы:
- Я получаю токен доступа = null при отладкеприложение. Как я могу получить токен доступа?
- Когда я начинаю отлаживать приложение, я получаю сообщение об ошибке «Произошла ошибка с AuthCode», но приложение продолжает работать, поэтому я не уверен, что там что-то не так. Это проблема?
- В LoginActivity.java я попытался изменить
LoginService loginService = ServiceGenerator.createService(LoginService.class, clientId, clientSecret);
на LoginService loginService = ServiceGenerator.createService(LoginService.class, code);
, что на самом деле ничего не изменило. Должно ли это иметь значение?
ServiceGenerator.java:
public class ServiceGenerator {
public static final String API_BASE_URL = "http://xxxx";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
/*public static <S> S createService(Class<S> serviceClass) {
return createService(serviceClass, null);
}*/
public static <S> S createService(Class<S> serviceClass, String clientId, String clientSecret) {
if (!TextUtils.isEmpty(clientId)
&& !TextUtils.isEmpty(clientSecret)) {
String authToken = Credentials.basic(clientId, clientSecret);
return createService(serviceClass, authToken);
}
return createService(serviceClass, null, null);
}
private static Retrofit retrofit;
public static <S> S createService(Class<S> serviceClass, final String authToken) {
if (!TextUtils.isEmpty(authToken)) {
AuthenticationInterceptor interceptor = new AuthenticationInterceptor(authToken);
if (!httpClient.interceptors().contains(interceptor)) {
httpClient.addInterceptor(interceptor);
builder.client(httpClient.build());
retrofit = builder.build();
}}
return retrofit.create(serviceClass);
}}
Файл AccessToken.java выглядит следующим образом. Видимо, accessToken
не назначен.
public class AccessToken {
private String accessToken;
private String tokenType;
public String getAccessToken() {
return accessToken;
}
public String getTokenType() {
if (!Character.isUpperCase(tokenType.charAt(0))) {
tokenType = Character
.toString(tokenType.charAt(0))
.toUpperCase() + tokenType.substring(1);
}
return tokenType;
}}
AuthenticationInterceptor.java:
public class AuthenticationInterceptor implements Interceptor {
private String authToken;
public AuthenticationInterceptor(String token) {
this.authToken = token;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder builder = original.newBuilder()
.header("Authorization", authToken);
Request request = builder.build();
return chain.proceed(request);
}}
LoginService:
@Headers("Accept: application/json")
@FormUrlEncoded
@POST("/oauth/token")
Call<AccessToken> getAccessToken(
@Field("code") String code,
@Field("grant_type") String authorization_code,
@Field("client_id") String clientId,
@Field("client_secret") String clientSecret,
@Field("redirect_Uri") String redirectUri);
//Call<AccessToken> getAccessToken(String code, String authorization_code);}
И вторая часть моей LoginActivity. java:
@Override
protected void onResume() {
super.onResume();
Uri uri = getIntent().getData();
if (uri != null && uri.toString().startsWith(redirectUri)){
new AsyncTaskRunner().execute();
} else {
Log.e("Error", "Error has occurred with AuthCode");
}
}
public class AsyncTaskRunner extends AsyncTask<String,String,String> {
@Override
protected String doInBackground(String... strings) {
Uri uri = getIntent().getData();
if (uri != null && uri.toString().startsWith(redirectUri)) {
String code = uri.getQueryParameter("code");
if (code != null) {
LoginService loginService = ServiceGenerator.createService(LoginService.class, clientId, clientSecret);
Call<AccessToken> call = loginService.getAccessToken(code, "authorization_code", clientId, clientSecret, redirectUri);
try {
accessToken = call.execute().body();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Log.d("Tag", accessToken.toString());
return String.valueOf(accessToken);
}
Я новичок в этом деле, поэтому любое объяснение будет с благодарностью! Мне известны другие сообщения, в которых задавались похожие вопросы, но я не могу оставлять комментарии, чтобы задавать вопросы.