首頁 >後端開發 >php教程 >Java後端開發:基於OAuth2建置安全性的API

Java後端開發:基於OAuth2建置安全性的API

王林
王林原創
2023-06-17 10:37:471581瀏覽

OAuth2是現代應​​用程式中廣泛使用的身份驗證和授權協定之一。它允許用戶授權第三方應用程式存取其資源,同時保護用戶敏感資訊不被洩露。在本文中,我們將介紹如何使用Java後端開發基於OAuth2建置安全性的API。

  1. 什麼是OAuth2?

OAuth2是一種流行的授權協議,旨在解決應用程式間授權問題。它允許用戶授權第三方應用程式存取其資源,例如Google雲端硬碟或Facebook帳戶,同時保護用戶憑證不被洩露。 OAuth2中包含4種角色:資源擁有者、客戶端、授權伺服器和資源伺服器。資源擁有者是具有被保護資源的使用者或實體;客戶端是請求存取資源的應用程式;授權伺服器是驗證資源擁有者身分並頒發存取權杖的伺服器;資源伺服器是儲存和提供資源的伺服器。 OAuth2透過授權伺服器發出令牌,客戶端使用令牌向資源伺服器請求資源。

  1. OAuth2流程

OAuth2流程包含下列步驟:

  1. 用戶端向授權伺服器發出請求,並包含其識別碼和重定向URI。
  2. 授權伺服器驗證客戶端身份,並要求資源擁有者授權客戶端存取其資源。
  3. 資源擁有者授權客戶端存取其資源。
  4. 授權伺服器發出存取權杖給客戶端。
  5. 用戶端使用存取權杖向資源伺服器請求存取資源。
  6. 資源伺服器驗證存取權杖是否有效,並提供資源。
  7. 基於OAuth2建構安全性的API

要建置安全性的API,我們需要實作下列步驟:

  1. 建立OAuth2伺服器:我們需要建立OAuth2伺服器來頒發存取令牌、驗證客戶端身分和授權請求。
  2. 配置Spring Security:Spring Security是Spring生態系統中的安全框架,用於處理身份驗證和授權。我們需要為Spring Security配置OAuth2驗證和授權流程。
  3. 建立客戶端:我們需要建立客戶端來要求存取資源伺服器,並向OAuth2伺服器取得存取權杖。
  4. 建立資源伺服器:我們需要建立資源伺服器來儲存和提供受保護的資源。
  5. 驗證存取權杖:我們需要在資源伺服器中驗證存取權杖是否有效,並根據令牌的範圍提供相應的資源。

以下是基於Java和Spring框架的OAuth2範例:

  1. #建立OAuth2伺服器:

@EnableAuthorizationServer
@Configuration
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {

private final PasswordEncoder passwordEncoder;
private final AuthenticationManager authenticationManager;
private final UserDetailsService userDetailsService;

@Autowired
public OAuth2AuthorizationConfig(
        PasswordEncoder passwordEncoder,
        AuthenticationManager authenticationManager,
        UserDetailsService userDetailsService
) {
    this.passwordEncoder = passwordEncoder;
    this.authenticationManager = authenticationManager;
    this.userDetailsService = userDetailsService;
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
            .withClient("client")
            .secret(passwordEncoder.encode("secret"))
            .authorizedGrantTypes("authorization_code")
            .scopes("read", "write", "trust")
            .redirectUris("http://localhost:8080/login/oauth2/code/");
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager)
            .userDetailsService(userDetailsService);
}

}

    ##設定Spring Security:
@Configuration##@EnableWebSecuritySecuritySecurity##@ EnableGlobalMethodSecurity(prePostEnabled = true)

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

private final UserDetailsService userDetailsService;
private final PasswordEncoder passwordEncoder;

@Autowired
public WebSecurityConfig(
        UserDetailsService userDetailsService,
        PasswordEncoder passwordEncoder
) {
    this.userDetailsService = userDetailsService;
    this.passwordEncoder = passwordEncoder;
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/oauth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
}

}

#建立客戶端:

    ## public class ClientController {
  1. private final OAuth2AuthorizedClientService authorizedClientService;
    
    @Autowired
    public ClientController(OAuth2AuthorizedClientService authorizedClientService) {
        this.authorizedClientService = authorizedClientService;
    }
    
    @GetMapping("/resource")
    public ResponseEntity<String> getResource(OAuth2AuthenticationToken authentication) {
        OAuth2AuthorizedClient authorizedClient = authorizedClientService.loadAuthorizedClient(
                authentication.getAuthorizedClientRegistrationId(),
                authentication.getName()
        );
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(authorizedClient.getAccessToken().getTokenValue());
        HttpEntity<String> entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = new RestTemplate().exchange(
                "http://localhost:8081/resource",
                HttpMethod.GET,
                entity,
                String.class
        );
        return response;
    }
  2. }


建立資源伺服器:

@RestController
    public class ResourceController {
  1. @GetMapping("/resource")
    public ResponseEntity<String> getResource() {
        return ResponseEntity.ok("resource");
    }
  2. }


驗證存取權杖:

@Configuration
    #@EnableResourceServer
  1. public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
  2. @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/oauth/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }
}



綜述

在本文中,我們介紹了OAuth2協定的流程,並提供了一個基於Java和Spring框架的範例。透過使用OAuth2,我們可以建立更安全的API,並保護使用者敏感資訊不外洩。在API開發中,我們應該始終重視安全性,以保護使用者資料和應用程式資源。

    以上是Java後端開發:基於OAuth2建置安全性的API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn