OAuth2 использует Redis для хранения информации о клиенте, а также AccessToken.

Spring Boot

использоватьRedisхранитьOAuth2Соответствующая информация о клиенте и сгенерированнаяAccessTokenхороший выбор,RedisПрисущая высокая эффективность и развертывание кластера являются отличными функциями, если их использовать в качестве服务认证中心Хранение данных может значительно повысить эффективность реагирования.

RedisОн также поддерживает функцию автоматического удаления с течением времени,OAuth2генерируетсяAccessTokenСоответствующие данные превышают настроенные有效时间После этого он будет автоматически очищен, что также косвенно повышает безопасность интерфейса.

теперь, когдаRedisЭто можно сделать так хорошо, как мы реализуем логику кода?

ApiBoot OAuth2поддерживается для использованияRedisхранитьAccessTokenДа, просто нужно изменитьapplication.ymlКонфигурация может быть достигнута, и соответствующее использование также можно понять, просмотрев документацию.

ApiBoot Security OAuth Component Series Статьи

Создать проект

Мы используемIDEAинструменты разработчика для созданияSpringBootпроект, в проектеpom.xmlдобавляем что нам нужноApiBootиз统一版本зависеть от и安全组件зависимости следующим образом:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

Добавить поддержку Redis

Поскольку нам нужно использоватьRedis, нам нужно добавить связанные зависимости в проект,SpringBootПредоставил нам упакованные зависимости, вpom.xmlвнутри файлаdependenciesДобавьте его под узел следующим образом:

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

Настроить информацию о подключении к Redis

SpringBootправильноRedisСоединение, операция с данными запакована, нам нужно толькоapplication.ymlДобавьте ответ в файл конфигурацииRedisинформация о соединении.

spring-boot-starter-data-redisКонфигурация, требуемая зависимостями, предоставляетсяRedisPropertiesПредоставляемые классом, некоторые поля конфигурации в этом классе имеют значения по умолчанию, а некоторые исходные коды выглядят следующим образом:

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {

    /**
     * Database index used by the connection factory.
     */
    private int database = 0;

    /**
     * Connection URL. Overrides host, port, and password. User is ignored. Example:
     * redis://user:password@example.com:6379
     */
    private String url;

    /**
     * Redis server host.
     */
    private String host = "localhost";

    /**
     * Login password of the redis server.
     */
    private String password;

    /**
     * Redis server port.
     */
    private int port = 6379;
  //...
}    

Подключить по умолчаниюRedisпросто нужноapplication.ymlнастроитьspring.redis.password,Следующее:

spring:
  # 配置Redis连接信息
  redis:
    password: 123123

passwordподключенRedisтребуемый пароль, вredis.confконфигурация в файле.

Связанное объяснение конфигурации:

  • spring.redis.database: если вы используетеRedis DataBaseне по умолчанию0index, вам нужно изменить конфигурацию
  • spring.redis.host: по умолчаниюlocalhost, если он не используется локально, необходимо изменить конфигурацию
  • spring.redis.url: это строка подключения, если она настроена, она будет автоматически перезаписанаdatabase,host,portи другие три информации о конфигурации
  • spring.redis.port: по умолчаниюRedisномер порта6379, если изменитьRedisНомер порта прослушивания, вам необходимо изменить эту конфигурацию

Включить ApiBoot OAuth Redis

ApiBoot OAuthпри условииredisпараметры конфигурации, вapplication.ymlчерез файлapi.boot.oauth.awayПараметры конфигурации задаются следующим образом:

api:
  boot:
    security:
      # 配置内存安全用户列表
      users:
        - username: yuqiyu
          password: 123123
    oauth:
      # 配置使用Redis存储OAuth2相关数据
      away: redis
      # 配置客户端列表
      clients:
        - clientId: minbox
          clientSecret: chapter

Для удобства демонстрации используемApiBoot SecurityРежим памяти настраивается пользователемyuqiyu, но также изменил значение по умолчаниюclientинформация, добавленоminboxклиент.

если правильноApiBoot Securityконфигурация пользователя илиApiBoot OAuthЕсли вы не понимаете конфигурацию клиента , вы можете проверить официальную документацию:

запустить тест

Перед запуском теста мы добавляемApiControllerКонтроллер, используемый для тестирования, код выглядит следующим образом:

/**
 * 测试Api控制器
 *
 * @author 恒宇少年
 */
@RestController
@RequestMapping(value = "/api")
public class ApiController {
    /**
     * 测试请求,需携带令牌访问
     *
     * @return
     */
    @GetMapping(value = "/index")
    public String index() {
        return "this is index";
    }
}

Контрольная точка: просмотрите AccessToken, хранящийся в Redis.

Ожидаемый эффект заключается в том, что когда мы отправляем выборкуAccessTokenзапросы, сгенерированныеAccessTokenхранить вRedis.

Ниже мы используемCURLкоманда, чтобы попытаться получить следующийAccessToken,Следующее:

➜ ~ curl minbox:chapter@localhost:9090/oauth/token -d 'grant_type=password&username=yuqiyu&password=123123'
{"access_token":"38a7ee20-2fad-43c5-a349-31e6f0ee0f29","token_type":"bearer","refresh_token":"f469b1e8-f63c-4be9-8564-2603f8458024","expires_in":7199,"scope":"api"}

Ниже мы используемredis-cliПосмотрим, было ли этоAccessTokenхранить вRedis,Следующее:

➜ ~ redis-cli 
127.0.0.1:6379> auth 123123
OK
127.0.0.1:6379> keys *
 1) "uname_to_access:minbox:yuqiyu"
 2) "refresh_to_access:f469b1e8-f63c-4be9-8564-2603f8458024"
 3) "access_to_refresh:1ea8e5cd-ea63-4a73-969f-9e7767f25f30"
 4) "auth:38a7ee20-2fad-43c5-a349-31e6f0ee0f29"
 5) "refresh_auth:6898bef4-f4a7-4fa9-858b-a4c62a1567d8"
 6) "refresh:6898bef4-f4a7-4fa9-858b-a4c62a1567d8"
 7) "refresh_auth:f469b1e8-f63c-4be9-8564-2603f8458024"
 8) "access:38a7ee20-2fad-43c5-a349-31e6f0ee0f29"
 9) "refresh_to_access:6898bef4-f4a7-4fa9-858b-a4c62a1567d8"
10) "auth_to_access:f02ceb5faa4577222082842b82a57067"
11) "refresh:f469b1e8-f63c-4be9-8564-2603f8458024"
12) "access_to_refresh:38a7ee20-2fad-43c5-a349-31e6f0ee0f29"
13) "client_id_to_access:minbox"

Результаты часто бывают неожиданными, поскольку здесь мы успешно поставилиOAuth2СгенерированоAccessTokenхранится вRedis,еслиAccessTokenСоответствующие данные превышаютexpires_inвремя, оно будет автоматически очищено.

Тестовая точка: интерфейс доступа с AccessToken

мы можем взять сгенерированныйAccessTokenчтобы получить доступ к тесту, добавленному вышеApiControllerинтерфейс внутри, следующим образом:

➜ ~ curl -H 'Authorization: Bearer 38a7ee20-2fad-43c5-a349-31e6f0ee0f29' http://localhost:9090/api/index
this is index

Мы можем получить возвращенный интерфейс интерфейса, что также доказывает, чтоAccessTokenВерификация не проблема,OAuth2осуществляется по запросуAccessTokenидти сRedisПроверка пройдена.

Постучать по доске, нарисовать ключ

ApiBoot OAuthподдерживается3种Методы хранения были описаны в статье, каждый метод был оптимизирован, простая конфигурация и добавление связанных зависимостей могут реализовать интеграцию, которая раньше вызывала много головной боли.

Если объем данных в производственной среде велик, рекомендуется использоватьRedisкластер для адресации хранилищаAccessTokenПроблема.

Если вы не знаете о двух других методах хранения ApiBoot OAuth, вы можете проверить, что я написалApiBootСерия статей:Краткое содержание цикла статей об использовании различных компонентов фреймворка с открытым исходным кодом ApiBoot

пример кода

Если вам понравилась эта статья, нажмите на репозиторий исходного кодаStar,Благодарность! ! ! Образец исходного кода этой статьи можно получить по следующим каналам, каталогapiboot-oauth-use-redis-storage:

автор личноблог

Используйте фреймворк с открытым исходным кодомApiBootПомочь вам стать архитектором сервисов интерфейса API