Вход через веб-службу отдыха через android с использованием неработающей модификации

Я делаю приложение для Android с помощью Retrofit 2. Мой REST Api все написано в Liferay. Теперь в Liferay, что я видел, для доступа к веб-сервисам, которые нам необходимы для аутентификации в первую очередь. Итак, я аутентифицировался следующим образом

http://test:[email protected]:8080/liferay-portlet/api/secure/jsonws/

Liferay имеет свой собственный метод проверки подлинности пользователя, который мы переопределили. Я проверил вызов веб-службы от Postman на его работу.

URL:http://test:[email protected]:8080/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name

закодированные формы

companyId:10154
screenName:xyz
password:xyz
active:true

Если я поместил это в почтальон, он правильно найдет ответ json.

Теперь, когда я вызываю то же самое из своего кода Android, я получаю ответ "Несанкционированный".

Моя служба обновления

public interface LoginApi {    
    @FormUrlEncoded
    @POST("/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name")
    Call<User> login(@Field("companyId")long companyId,@Field("screenName")String screenName,@Field("password")String password,@Field("active")boolean active);
}

My RestApiManager Class (этот класс используется для вызова интерфейса службы и создания модификатора)

public class RestApiManager {

    private LoginApi loginApi;

    public LoginApi login() {
        if (loginApi==null) {
            GsonBuilder gson=new GsonBuilder();
            gson.registerTypeAdapter(String.class, new StringDeserializer());
            Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://test:[email protected]:8080")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
            loginApi=retrofit.create(LoginApi.class);
    }
    return loginApi;
}

Вызов RestApiManager

Call<User> callUser=restApiManager.login().login(loginData.getCompanyId(),loginData.getScreenName(),loginData.getPassword(),loginData.isActive());
callUser.enqueue(new Callback<User>() {
    @Override
    public void onResponse(Response<User> response, Retrofit retrofit) {
        Log.d("Login","Login Response:"+response.body());
    }

    @Override
    public void onFailure(Throwable t) {
        Log.d("Login","Login Response:"+t.getMessage());
    }
});

Ответы

Ответ 1

Похоже, что ваш запрос должен иметь тело JSON вместо переменных POST? Вы вызываете веб-службу JSON, и параметры вашего примера выглядят больше JSON, чем POST. Если да, то вы можете инкапсулировать свои параметры в объект -

public class User {
    int companyId;
    String screenName;
    String password;
    boolean active;

    User(int companyId, String screenName, String password, boolean active) {
        this.companyId = companyId;
        this.screenName = screenName;
        this.password = password;
        this.active = active;
}

Ваш интерфейс будет -

public interface LoginApi {    
    @POST("/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name")
    Call<User> login(@Body User user);
}

и постройте свой вызов как -

User user = new User(loginData.getCompanyId(),loginData.getScreenName(),loginData.getPassword(),loginData.isActive());
Call<User> callUser = restApiManager.login().login(user);

Ответ 2

Управление сеансом в кросс-платформе не работает так, как работает в браузере. Postman - это веб-клиент, который работает на платформе браузера.

1. Единственное решение - поддерживать файлы cookie на устройстве.

Отметьте этот ответ сеансы управления с Android-приложением.

2. Другим решением будет использование аутентификации на основе Json Web Token.

Ответ 3

Я попытался запустить демо-код на своем локальном ПК, но вам не повезло, так как ваш сервер находится в вашей локальной сети, об этом вопросе, если вы используете cookie или сеанс авторизации на своей стороне сервера, я бы предложил вам попробовать setCookieHandler, как показано ниже, PersistentCookieStore.java, вы можете найти здесь

private PersistentCookieStore cookieStore= new PersistentCookieStore(JApplication.getInstance().getApplicationContext());
CookieManager cookieManager = (new CookieManager(
            cookieStore,
            CookiePolicy.ACCEPT_ALL));

okHttpClient.setCookieHandler(cookieManager);
OkClient okClient = new OkClient(okHttpClient);
RestAdapter restAdapter = new RestAdapter.Builder()
            .setRequestInterceptor(new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade request) {
                    request.addHeader(Constant.Header_UserAgent, getUserAgent());
                }
            })
            .setClient(okClient)
            .setEndpoint(URL)
            .setErrorHandler(new HttpErrorHandler())
            .setConverter(new GsonConverter(gson))
            .build();

Ответ 4

Нам может быть сложно помочь вам, не зная, какой именно запрос вам понадобится.

Поэтому я рекомендую вам настроить Logging Interceptor, чтобы войти в контакт с тем, что действительно происходит, и если вы все еще не знаете, что происходит, вы можете вернуться к нам с дополнительной информацией.

Проверьте этот ответ, чтобы узнать, как настроить LoggingInterceptor с помощью Retrofit 2: Регистрация с помощью Retrofit 2

Надеюсь, что это поможет.

С уважением.

Ответ 5

Я пробовал все приведенные здесь решения, но, к сожалению, ничего не сработало. Единственное решение, которое я нашел, чтобы вызвать услугу lifer изнутри android, - использовать пожизненный мобильный sdk. У него уже есть методы и службы для вызова услуг liferay. Вы также можете позвонить своим пользовательским сервисам. Дополнительная информация Liferay Mobile SDK