Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Пытаюсь прикрутить авторизацию к скелету сервера, получается не особо)) Подскажите куда копать дальше. В интернетах все примеры для web клиентов, ввод логина с паролем идет через форму, а как сделать авторизацию для клиента на том же андроиде не понятно.
Суть в чем: отправляем с клиента запрос типа [url]http://?dress%:8081/auth?login=login&password=pass[/url], авторизируемся (или получаем сообщение об ошибке) и далее уже получаем доступ к тем запросам, которые требуют авторизации.

Контроллер:
+

@RestController
public class ApiController {

    @Autowired
    private CityRepository cityRepository;

    @GetMapping(path="/auth")
    public @ResponseBody
    BaseResponse userLogin(@RequestParam String email, @RequestParam String password) {
        // ???????
        return new BaseResponse("User not found", BaseResponse.CODE_ERROR);
    }

    @GetMapping(path="/auth/getCities")
    public @ResponseBody
    BaseResponse getCities(@RequestParam String name) {
        return new BaseResponse<>(cityRepository.findCityByName(name), BaseResponse.CODE_SUCCESS);

    }

    @GetMapping(path="/auth/getAllCities")
    public @ResponseBody
    BaseResponse getAllCities() {
        return new BaseResponse<>(cityRepository.findAllCites(), BaseResponse.CODE_SUCCESS);

    }
    
}



Конфиг:
+

@Configuration
@EnableWebSecurity
public class SecurityConfig
    extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests().antMatchers("/auth").permitAll()
            .and()
                .authorizeRequests().antMatchers("/auth/**").authenticated()
            .and()
                .httpBasic()
            .and()
                .sessionManagement().disable();
    }

}



Что нужно реализовать в методе userLogin() ?
Или я туплю и оно не так в принципе делается ?
6 апр 19, 15:54    [21854713]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 1009
1. НИКОГДА, НИКОГДА!!! не используйте для авторизации GET запросы и тем более не передавайте логины и пароли в URL. Этот запрос может закешироваться и могут утянуть злоумышленники. То бишь безопасности НОЛЬ.

2. Используйте JWT авторизацию. Тот же OAuth от сприга. Можете авторизовываться откуда угодно.

3. В методе userLogin нужно проверить полученные данные на корректность - не null и не пустые ли. Далее. нужно сходить в бд и глянуть а есть ли такой юзверь по логину и проверить пароль, подходит ли он тому что пришло. ПАРОЛИ хранить в зашифрованном виде!!! не повторяйте ошибок Лицокниги.
6 апр 19, 16:28    [21854725]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Tsyklop
1. НИКОГДА, НИКОГДА!!! не используйте для авторизации GET запросы и тем более не передавайте логины и пароли в URL. Этот запрос может закешироваться и могут утянуть злоумышленники. То бишь безопасности НОЛЬ.

Это понятно, спасибо, тут все в качестве примера, не более. Я саму цепочку пока уловить не могу, как, что и где нужно вызвать.

Tsyklop
3. В методе userLogin нужно проверить полученные данные на корректность - не null и не пустые ли. Далее. нужно сходить в бд и глянуть а есть ли такой юзверь по логину и проверить пароль, подходит ли он тому что пришло. ПАРОЛИ хранить в зашифрованном виде!!! не повторяйте ошибок Лицокниги.

Это тоже все понятно, оно даже есть, вопрос в том, как авторизировать пользователя, если все ок, с помощью каких механизмов ?
6 апр 19, 16:59    [21854731]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 1009
bobo96
Это тоже все понятно, оно даже есть, вопрос в том, как авторизировать пользователя, если все ок, с помощью каких механизмов ?


Если OAuth или JWT то через токен. Клиенту отдайтся токен и при каждом запросе клиент шлет этот токен. Сервер его проверяет и т.д.
Если без этого то: через сессию, но тогда будет проблема на других девайсах, тех же андроидах ибо нужно будет сохранять куку JSESSIONID. Можно через куки токеном. Принцип тот же что и через сессию, но на дольший срок
6 апр 19, 17:11    [21854733]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Tsyklop
bobo96
Это тоже все понятно, оно даже есть, вопрос в том, как авторизировать пользователя, если все ок, с помощью каких механизмов ?


Если OAuth или JWT то через токен. Клиенту отдайтся токен и при каждом запросе клиент шлет этот токен. Сервер его проверяет и т.д.

А можно пример ? Какую-нибудь элементарщину, что б был откуда плясать.
6 апр 19, 17:55    [21854754]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 1009
bobo96,
https://www.baeldung.com/spring-security-oauth-jwt
https://www.callicoder.com/spring-boot-spring-security-jwt-mysql-react-app-part-2/
6 апр 19, 19:32    [21854798]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Tsyklop
bobo96,
https://www.baeldung.com/spring-security-oauth-jwt
https://www.callicoder.com/spring-boot-spring-security-jwt-mysql-react-app-part-2/

Спасибо!)
6 апр 19, 19:51    [21854807]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Tsyklop
Если без этого то: через сессию, но тогда будет проблема на других девайсах, тех же андроидах ибо нужно будет сохранять куку JSESSIONID.

У вас не работают на сотовом сайты? Какая проблема с андроидом?
6 апр 19, 22:50    [21854879]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
bobo96
Я саму цепочку пока уловить не могу, как, что и где нужно вызвать.

Вы сделайте сначала для веб клиентов. а потом уже для не веб клиентов.
Потому что не веб клиент это не http а например сокет\UDP\TCP\FTP.
Поэтому не трогайте пока андроид. Клиент эксплорер там один в один как на компе.
...
Самая простая аутентификация "базовая" включается галкой в web.xml. Это без спринга.
Потом идёт forms, потом пошли на основе токенов.
Потом с помощью специального ПО - spring security.
Потом керберос и так бесконечно.
6 апр 19, 23:16    [21854892]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Здравствуйте!
Продолжу, если никто не против))
С авторизацией разобрался, правда пока не с oauth2, а с базовой, но тем не менее. Еще раз спасибо за ссылки!
Несколько тупых вопросов:
1. Те токены, которые выдает сервер клиенту, хранятся где-то на сервере ? Как ими управлять ? Т.е. сегодня я выдал токен, а завтра хочу забрать (удалить), как это сделать ? Погуглил, вроде-как каких-то стандартных механизмов нет, варинтов много. Как делать это правильно ?
2. Вопрос по самому токену. Понятно, что с его помощью сервер понимает, что запрос делает проверенный источник. Но запросы же можно перехватить, а потом плевать их серверу и так же получать ответы, не ?)) То-есть проще говоря как сервер определяет, что запрос делает тот клиент, которому он выдавал токен ?

з.ы. Вот эти статьи помогли разобраться, если кому вдруг будет интересно)
9 апр 19, 08:24    [21856687]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
bobo96
а с базовой
это не базовая. Это на основе токенов. Противоположная на основе сессий и куков проще для новичка и проектов корпоративных (чтобы отобрать в любой момент)
9 апр 19, 09:53    [21856748]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
bobo96,


1. Почему бы токены и не хранить в базе, если вам хочется вдруг все сделать их невалидными? Другой вопрос, какая такая потребность у вас возникает, чтобы токены инвалидами сделать? Уменьшайте время жизни токена и либо пишите свои костыли для обновления токена, либо запрашивайте авторизацию каждые полчаса ;)

2. Чтобы перехватить было сложнее, все коммуникации с сервером только через https. Никак не определяет, сейчас распространена автоиазция oauth2 - где выдается 2 токена. Первый, который используется для запроса ресурсов, второй(refresh token) - когда сервер возвращает invalid token. С помощью refresh токена идет запрос на получение новой пары токенов и все идет дальше.

У основного токена обычно довольно короткое время жизни(вот, к примеру, в вашем коде время жизни чето довольно больше jwtExpirationInMs - параметр..60480000 мс).
9 апр 19, 10:15    [21856786]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Понял, спасибо!
9 апр 19, 10:31    [21856813]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
А по https подскажите: создал сертификат, положил его в resources, изменил application.properties
server.port = 5001
server.ssl.key-store= tomcat_demo.keystore
server.ssl.key-store-password= pass
server.ssl.keyStoreType= PKCS12
server.ssl.keyAlias= tomcat_demo
server.ssl.enabled = true
server.ssl.protocol = TLS
Приложение запускается нормально, без ошибок:
2019-04-09 13:07:49.257 INFO 10984 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 5001 (https)
Но при запросе https://localhost:5001/api/auth/signin postman говорит Could not get any response
Что не так делаю ?
9 апр 19, 11:11    [21856866]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Отбой, настройках postman'а выключил верификацию сертификата и все заработало.
9 апр 19, 11:42    [21856902]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Еще вопрос: тот вариант развертывания сервера, который "из коробки", spring boot, можно использовать в конечных продуктах или нужно все это хозяйство как-то по-другому разворачивать ?
9 апр 19, 12:09    [21856947]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 1009
bobo96, одна из пфич бута это быстрое развертывание. ответ -да
9 апр 19, 12:17    [21856960]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Спасибо!
9 апр 19, 12:28    [21856978]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Непонятки с expiration time токена.
Выставил время жизни 15 минут
При входе создаем токен:
    public String generateToken(Authentication authentication) {

        UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal();

        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);
        System.out.println("Curent time: " + new Date(new Date().getTime()));
        System.out.println("expiryDate: " + expiryDate);

        return token = Jwts.builder()
                .setSubject(Long.toString(userPrincipal.getId()))
                .setIssuedAt(new Date())
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS512, jwtSecret)
                .claim("TEST", "lololo")
                .compact();
    }

Вроде все ок:
Curent time: Tue Apr 09 10:34:34 UTC 2019
expiryDate: Tue Apr 09 10:49:34 UTC 2019


Беру токен, который прилетел в ответ, иду с ним в закрытый раздел попутно вытаскивая id пользователя:
    Long getUserIdFromJWT(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(jwtSecret)
                .parseClaimsJws(token)
                .getBody();

        System.out.println("Curent time: " + new Date(new Date().getTime()));
        System.out.println("Expiration time: " + claims.getExpiration());
        System.out.println("IssuedAt exp: " + claims.getIssuedAt());

        return Long.parseLong(claims.getSubject());
    }

И вот тут начинается какая-то дичь:
Curent time: Tue Apr 09 10:35:01 UTC 2019
Expiration time: Mon Apr 15 09:46:31 UTC 2019
IssuedAt exp: Mon Apr 08 09:46:31 UTC 2019

Почему claims.getExpiration() на 6 дней перескочил ??
9 апр 19, 13:43    [21857106]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
bobo96,
Не надо в одной теме писать как у тебя дела на работе.
Разбивай на темы.
9 апр 19, 14:04    [21857146]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
bobo96
Member

Откуда:
Сообщений: 88
Petro123
bobo96,
Не надо в одной теме писать как у тебя дела на работе.
Разбивай на темы.

Да не вопрос.
По последнему вопросу есть мысли ?
9 апр 19, 14:42    [21857208]     Ответить | Цитировать Сообщить модератору
 Re: Как настроить базовую авторизацию для не-web клиентов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
bobo96,
Мысль есть - заводи тему)
9 апр 19, 14:58    [21857259]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить