Я пытаюсь войти и получить токен, используя модификацию 2, из моего API, который использует Spring Boot 2.
Проблема, с которой я столкнулся, заключается в том, что она работает в Postman, но я получаю 403код состояния в Android.
Это код, который я использую в Почтальоне:
Я пробовал это двумя способами,но я получаю тот же код состояния 403:
Класс TokenResponse:
public class TokenResponse {
@SerializedName("token_type")
@Expose
private String tokenType;
@SerializedName("access_token")
@Expose
private String accessToken;
public String getTokenType() {
return tokenType;
}
public void setTokenType(String tokenType) {
this.tokenType = tokenType;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
}
Служба (два способа, которые я пробовал):
@POST("/oauth/token/")
@FormUrlEncoded
Call<TokenResponse> getToken(@Field("client_id") String clientId,
@Field("client_secret") String clientSecret,
@Field("grant_type") String grantType,
@Field("username") String username,
@Field("password") String password);
@FormUrlEncoded
@POST("/oauth/token/")
Call<TokenResponse> getToken2(@Field("grant_type") String grantType,
@Field("username") String username,
@Field("password") String password,
@Header("Authorization") String authorization);
И классгде я делаю запрос (также с двумя способами, которые я пробовал):
private void oauth2Example() {
Retrofit.Builder builder = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://ip:8080");
Retrofit retrofit = builder.build();
UserService service = retrofit.create(UserService.class);
//way number one
byte[] credentials = "androidapp:12345".getBytes();
String basicAuth = "";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
basicAuth = "Basic " + Base64.getEncoder().encodeToString(credentials).trim();
}
Call<TokenResponse> call = service.getToken2("password", "j@h.com", "12345", basicAuth);
//FINISH way number 1
//way number two
Call<TokenResponse> call = service.getToken("androidapp", "12345", "password", "j@h.com", "12345");
//FINISH way number 2
//RESULT
call.enqueue(new Callback<TokenResponse>() {
@Override
public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) {
if (response.isSuccessful()){
Toast.makeText(PostActivity.this, response.body().getAccessToken(), Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(PostActivity.this,"error " + response.code(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<TokenResponse> call, Throwable t) {
Toast.makeText(PostActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}
});
}
Как вы можете видеть, я прокомментировал два способа, которые я пытаюсь (я не использую одну и ту же переменную "call")во время, конечно), но в обоих случаях, как я уже сказал, я получаю ошибку 403.
Что я должен изменить, чтобы получить токен на предъявителя, который я могу получить от Почтальона, ноЯ просто получаю 403 в Android?