Một ưu điểm lớn của OAuth2 là có thể cho phép chúng ta giới hạn khoảng thời gian mà một request với access token cụ thể được phép sử dụng resources. Access token sẽ quy định expiration time của nó, các API resources sẽ dựa vào expiration time này để quyết định có cho phép Client Application tiếp tục truy cập resource hay là không? Sử dụng Spring Authorization Server để implement Authorization Server thì cách cấu hình expiration time cho access token như thế nào? Chúng ta sẽ cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Điều đầu tiên các bạn cần biết là, chúng ta sẽ sử dụng class TokenSettings của Spring Authorization Server để cấu hình một số thông tin liên quan đến access token. Hiện tại, các bạn có thể cấu hình expiration time, reuse refresh token, refresh token expiration time, ID token signature algorithm.
Để cấu hình expiration time ở mức system level, apply hết cho tất cả các client trong hệ thống, các bạn có thể định nghĩa một bean của TokenSettings như sau:
1 2 3 4 5 6 7 8 |
@Bean public TokenSettings tokenSettings() { // @formatter:off return TokenSettings.builder() .accessTokenTimeToLive(Duration.ofMinutes(30L)) .build(); // @formatter:on } |
Sau đó thì trong khai báo của mỗi RegisteredClient, các bạn khai báo thêm thông tin về tokenSettings như sau:
1 2 3 4 5 6 7 8 9 |
// @formatter:off RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("huongdanjava1") .clientSecret("{noop}123") .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) .tokenSettings(tokenSettings()) .build(); // @formatter:on |
Này là mình khai báo RegisteredClient với TokenSettings trong một Java class file, nếu các bạn định nghĩa trong 2 class file khác nhau thì có thể sử dụng @Autowired annotation thì inject bean của TokenSettings vào rồi sử dụng nó trong method tokenSettings() của RegisteredClient.
Nếu các bạn muốn specific expiration time cho riêng mỗi RegisteredClient thì hãy khởi tạo mới và sử dụng đối tượng TokenSettings cho đối tượng RegisteredClient đó nhé.
Chạy ví dụ trong bài viết Hiện thực OAuth Authorization Server sử dụng Spring Authorization Server với cấu hình TokenSettings như trên:
sau đó parse nội dung của access token sử dụng https://jwt.io/, các bạn sẽ thấy thời điểm issue access token là:
và thời gian expire là:
Expiration time mặc định của một access token trong Spring Authorization Server là 5 phút các bạn nhé!