Аутентификация при входе в Android с помощью Retrofit

У меня есть LoginActivity, которая получает имя пользователя и пароль. Я пытаюсь получить токен аутентификации, используя POST Retrofit 2 и OkHTTP. Я создал службу, которая создает модифицированный адаптер, а также клиент OkHttp. У меня есть интерфейс, но здесь начинаются мои проблемы.

Я должен опубликовать свои учетные данные (имя пользователя и пароль от входа) в FormEncodedURL на серверную часть, чтобы получить токен, для которого у меня есть POJO, называемый AccessToken. Я действительно не уверен, что делаю это правильно с помощью метода обратного вызова и т.д.

URL-адрес должен иметь вид http://xxxxxxxxxxxxxxxx/token/username=smcnary%40metrostudy.com&password=xxxxxx&grant_type=password

Пожалуйста, дайте мне знать, если вам нужно что-то еще, чтобы помочь мне с этим постом, так как я новичок в разработке Android и сложен.

Мой вызов POST выглядит так:

 @POST("token")
Call<AccessToken> getAuthToken(@Body User user);

Где модель пользователя:

public class User {
@SerializedName("password")
String password;
@SerializedName("username")
String email;
String grantType;
public User(String email, String password, String grantType ) {
    this.email = email;
    this.password = password;
    this.grantType = grantType;
}}

И модель AccessToken:

public class AccessToken {

private String accessToken;
private String tokenType;
private Integer expiresIn;
private String name;
private String title;
private String picImageBase64String;
private String Issued;
private String Expires;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

public String getAccessToken() {
    return accessToken;
}

public void setAccessToken(String accessToken) {
    this.accessToken = accessToken;
}

public String getTokenType() {
    return tokenType;
}

public void setTokenType(String tokenType) {
    this.tokenType = tokenType;
}

public Integer getExpiresIn() {
    return expiresIn;
}

public void setExpiresIn(Integer expiresIn) {
    this.expiresIn = expiresIn;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getPicImageBase64String() {
    return picImageBase64String;
}

public void setPicImageBase64String(String picImageBase64String) {
    this.picImageBase64String = picImageBase64String;
}

public String getIssued() {
    return Issued;
}

public void setIssued(String Issued) {
    this.Issued = Issued;
}

public String getExpires() {
    return Expires;
}

public void setExpires(String Expires) {
    this.Expires = Expires;
}

public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
}

public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
}

Вот логика в LoginActivity

public void login() {
    Log.d(TAG, "Login");

    if (!validate()) {
        onLoginFailed();
        return;
    }

    _loginButton.setEnabled(false);

    final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this,
            R.style.AppTheme);
    progressDialog.setIndeterminate(true);
    progressDialog.setMessage("Authenticating...");
    progressDialog.show();

    String email = _emailText.getText().toString();
    String password = _passwordText.getText().toString();
    String grantType = "grant_type=password";
    User user = new User(email, password, grantType);
    Call<AccessToken> call = figgApiService.getAuthToken(user);
    call.enqueue(new Callback<AccessToken>() {
        @Override
        public void onResponse(Call<AccessToken> call, Response<AccessToken> response) {
            int statusCode = response.code();
            AccessToken accesstoken = response.body();
        }

        @Override
        public void onFailure(Call<AccessToken> call, Throwable t) {

        }
    });

person Crumblenautjs    schedule 24.03.2016    source источник
comment
Просто попробуйте, поставьте точку останова в своем onResponse, и если она туда не попадет, то она перейдет в onFailure. Почему ваш URL-адрес передает пароль таким образом, вы должны иметь его в теле данных сообщения   -  person CQM    schedule 24.03.2016


Ответы (1)


Вам нужно изменить свой интерфейс на это:

@FormUrlEncoded
@POST("token")
Call<AccessToken> getAuthToken(@Field("username") String username, @Field("password") String password, @Field("grant_type") String grantType);

И ваш звонок будет таким:

Call<AccessToken> call = figgApiService.getAuthToken(email, password, grantType);
person Jorge Pastor    schedule 24.03.2016