SpringBoot — Oauth2.0 (1) — первое знакомство

Spring Boot
SpringBoot — Oauth2.0 (1) — первое знакомство

задний план

В последнее время я работаю над безопасностью и аутентификацией API-интерфейсов платформы. Безопасность интерфейса и аутентификация очень важны в производственной деятельности. В настоящее время наиболее популярным методом аутентификации является Oauth2. Далее давайте воспользуемся зависимостями безопасности SpringBoot, чтобы просто попрактиковаться и понять процесс Oauth2.

Простое понимание Oauth2

что это?

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

Четыре способа авторизации

  • Режим кода авторизации (код авторизации)

    Этот метод является наиболее безопасным, код авторизации передается через интерфейс, а токен хранится на сервере. В основном подходит для веб-приложений с бэкендами.

  • неявный (неявный)

    Этот метод не имеет промежуточных шагов кода авторизации и очень небезопасен. В основном подходит для чистых интерфейсных приложений.

  • пароль

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

  • учетные данные клиента

    Этот метод подходит для приложений между серверами и серверами и касается аутентификации безопасности интерфейса.

учетные данные клиента

Этот подход представляет собой подход к аутентификации, который мы в основном практикуем сегодня. Если есть учащиеся, которые часто подключаются к внешним третьим лицам во время обычного открытия, они должны быть хорошо знакомы с этим методом аутентификации. Самое обычное для нас — получить токен доступа с официального сервера официального аккаунта WeChat в разработке WeChat, после чего мы запрашиваем соответствующий интерфейс WeChat, и нам нужно принести этот токен доступа, чтобы иметь разрешение на доступ.

SpringBoot Oatuh2 Простая практика

После того, как у нас есть краткое представление об Oauth2, давайте быстро его реализуем.

Шаги грубого обдумывания:

  1. Введение связанных зависимостей
  2. настроить
    • Информация об услуге аутентификации
    • Информация о службе ресурсов
  3. проверять
    • Получить токен доступа для аутентификации
    • доступ к ресурсам

Pom

Чтобы включить аутентификацию Oauth2, мы должны ввести зависимости безопасности SpringBoot и зависимости Spring Oauth2.

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.security.oauth</groupId>
      <artifactId>spring-security-oauth2</artifactId>
    </dependency>

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

Authorization Service Config — конфигурация службы аутентификации

Конфигурация службы аутентификации в основном включает следующие три аспекта:

  1. Определите ограничения безопасности для конечной точки маркера

    Основная конфигурация: разрешать ли клиенту входить в систему в виде формы, определять метод шифрования пароля и т. д.

  2. Определить детали клиента

    Информация о клиенте включает в себя: метод хранения информации о клиенте (память или база данных) и информацию, необходимую для аутентификации клиента, включая client_id, client_secret, grant_type, scope

  3. Определите конечные точки авторизации и токенов, а также службы токенов.

    Вы можете настроить авторизованную конечную точку, способ хранения токена и т. д.

Конфигурация службы аутентификации выглядит следующим образом: (Эта практика соответствует принципу сохранения того, что можно сохранить)

@Configuration
@EnableAuthorizationServer
public class MyAuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {

    /**
     * 配置安全约束相关配置
     * @param security 定义令牌终结点上的安全约束
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        // 支持client_id、client_secret以form表单的形式登录,参考可见:微信获取access token
        security.allowFormAuthenticationForClients();
    }

    /**
     * 配置客户端详细信息
     * @param clients 定义客户端详细信息服务的配置程序。可以初始化客户端详细信息,也可以只引用现有存储。
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            // client_id
            .withClient("gold")
            // 授权方式
            .authorizedGrantTypes("client_credentials")
            // 授权范围
            .scopes("write")
            // client_secret
            .secret("{noop}123456");

    }

    /**
     *
     * @param endpoints 定义授权和令牌端点以及令牌服务。
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        super.configure(endpoints);
    }
}

Обратите внимание на конфигурацию пароля, и вам необходимо настроить метод шифрования.Эта практика не использует какой-либо метод шифрования.

Дополнительные сведения см. в разделе ДелегированиеPasswordEncoder или PasswordEncoderFactories.

Конфигурация службы ресурсов — конфигурация службы ресурсов

Конфигурация сервисов ресурсов в основном включает следующие два аспекта:

  1. Конфигурация безопасности служб ресурсов

    Настраиваемый идентификатор ресурса, без сохранения состояния — разрешает ли ресурс только аутентификацию на основе токенов, как хранится токен и т. д.

  2. Настройка безопасности HTTP

    Наш защищенный API настроен здесь

Конфигурация, связанная с ресурсами:

API:

@RestController
@AllArgsConstructor
public class ResController {

    @GetMapping("/res/{id}")
    public String testOauth(@PathVariable String id) {
        return "Get the resource " + id;
    }
}

Конфигурация службы ресурсов:

@Configuration
@EnableResourceServer
public class MyResourceServerConfigurer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        super.configure(resources);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/res/**").authenticated();
    }
}

Полная сводка конфигурации

Мы завершили самую базовую настройку SpringBoot Oauth2.

Информация о клиенте:

  • client_id : gold
  • client_secret : 123456
  • scopes : write
  • grant_type : client_credentials

Далее, давайте проверим, что наша конфигурация вступила в силу.

Следующий запрос делается в postman. base_url — это установленная глобальная переменная, которая на самом делеhttp://127.0.0.1:8080

прямой запрос

Когда мы запрашиваем его напрямую, приложение возвращает Unauthorized и не может получить доступ:

image-20200828171302993

получить токен доступа

Конечная точка Springboot oauth для получения токена по умолчанию: /oauth/token

image-20200828153448422

Как видно из результата запроса, мы получили access_token, а время обновления составляет 43199 секунд или 12 часов.

запросить защищенный ресурс

image-20200828153851996

В результате мы успешно использовали токен доступа для доступа к защищенному ресурсу.

резюме

В этой статье кратко рассказывается, что такое Oauth2 и как его авторизовать.Студенты, которые хотят узнать больше об Oauth2, могут перейти наБлог учителя Жуань ИфэнИди и учись. После этого метод аутентификации учетных данных на стороне клиента просто реализуется с помощью SpringBoot.Основной ключевой момент его настройки — понятьКонфигурация сервера ресурсов (ResourceServerConfigurer)а такжеКонфигурация сервера аутентификации (AuthorizationServerConfigurer). Студенты, двигайтесь и действуйте!

Персональный уровень ограничен, приглашаем всех исправлять и общаться вместе~~~

демо:GitHub.com/золотая тыква…

Reference:

  1. spring-security-oauth
  2. Понимание OAuth 2.0