Rumah > Java > javaTutorial > Menggunakan pengesahan OAuth2 dalam pembangunan API Java

Menggunakan pengesahan OAuth2 dalam pembangunan API Java

王林
Lepaskan: 2023-06-18 11:49:37
asal
1537 orang telah melayarinya

Dalam pembangunan Java API, pengesahan merupakan isu yang tidak dapat dielakkan. OAuth2 ialah kaedah pengesahan popular yang melindungi sumber API dengan memberikan akses. Artikel ini akan memperkenalkan cara menggunakan OAuth2 untuk pengesahan dalam pembangunan API Java.

Pengenalan kepada OAuth2

OAuth2 ialah standard terbuka untuk kebenaran yang membolehkan pengguna membenarkan aplikasi pihak ketiga mengakses sumber pelayan mereka tanpa perlu berkongsi bukti kelayakan mereka. Standard OAuth2 merangkumi peranan berikut:

  • Pemilik Sumber: pemilik sumber, iaitu pengguna
  • Pelayan Sumber: pelayan sumber, pelayan yang menyediakan sumber; 🎜>
  • Pelanggan: Pelanggan, iaitu, aplikasi pihak ketiga;
  • Pelayan Kebenaran: Pelayan kebenaran, digunakan untuk mengeluarkan token akses.
Proses kebenaran OAuth2 termasuk langkah berikut:

    Klien menghantar permintaan kebenaran ke Pelayan Kebenaran
  • Pelayan Kebenaran meminta kebenaran daripada Pemilik Sumber;
  • Selepas Pemilik Sumber membenarkan, Pelayan Kebenaran menghantar token akses kepada Pelanggan
  • Klien menggunakan token akses untuk menghantar permintaan kepada Pelayan Sumber; Pelayan mengesahkan token akses dan menyediakan sumber.
  • OAuth2 menyokong berbilang jenis kebenaran, termasuk mod kod kebenaran, mod kata laluan, mod klien, mod kebenaran tersirat, dsb. Dalam pembangunan API Java, mod kod kebenaran dan mod kata laluan biasanya digunakan.
Mod kod kebenaran OAuth2

Mod kod kebenaran ialah jenis kebenaran yang paling biasa digunakan dalam OAuth2 Ia termasuk langkah berikut:

Klien menghantar permintaan kebenaran kepada. Pelayan Kebenaran, Termasuk ID Klien dan URI hala tuju; Pelayan Kebenaran menghantar kod keizinan ke URI pengalihan ;

    Klien menggunakan kod keizinan untuk menghantar permintaan ke Pelayan Kebenaran, termasuk ID Pelanggan dan Rahsia Pelanggan
  • Pelayan Kebenaran mengesahkan ID Pelanggan dan Rahsia Pelanggan, dan jika betul, mengeluarkan token akses kepada Pelanggan;
  • Klien menggunakan token akses untuk menghantar permintaan kepada Pelayan Sumber.
  • Dalam pembangunan API Java, anda boleh menggunakan rangka kerja Spring Security OAuth2 untuk melaksanakan pengesahan mod kod kebenaran.
  • Pertama sekali, anda perlu menambah kebergantungan berikut dalam fail pom.xml:
  • <dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
        <version>2.3.4.RELEASE</version>
    </dependency>
    Salin selepas log masuk
    Salin selepas log masuk
  • Kemudian, tambahkan konfigurasi berikut dalam fail konfigurasi Spring MVC:
  • <security:http pattern="/oauth/token" create-session="stateless"
        authentication-manager-ref="authenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <security:intercept-url pattern="/oauth/token" access="isAuthenticated()" method="POST" />
        <security:anonymous enabled="false" />
        <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
        <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    </security:http>
    
    <security:http pattern="/api/**" create-session="never"
        entry-point-ref="oauthAuthenticationEntryPoint"
        access-decision-manager-ref="accessDecisionManager"
        xmlns="http://www.springframework.org/schema/security">
        <security:anonymous enabled="false" />
        <security:intercept-url pattern="/api/**" access="ROLE_USER" />
        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    </security:http>
    
    <bean id="clientAuthenticationEntryPoint"
        class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
        <property name="realmName" value="spring-boot-oauth2" />
        <property name="typeName" value="Basic" />
    </bean>
    
    <bean id="oauthAuthenticationEntryPoint"
        class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
        <property name="realmName" value="spring-boot-oauth2" />
        <property name="typeName" value="Bearer" />
    </bean>
    
    <bean id="oauthAccessDeniedHandler"
        class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
    
    <bean id="clientCredentialsTokenEndpointFilter"
        class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <bean id="resourceServerFilter"
        class="org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter">
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <bean id="accessDecisionManager"
        class="org.springframework.security.access.vote.UnanimousBased"
        xmlns="http://www.springframework.org/schema/beans">
        <constructor-arg>
            <list>
                <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
                <bean class="org.springframework.security.access.vote.RoleVoter" />
                <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            </list>
        </constructor-arg>
    </bean>
    
    <security:authentication-manager id="authenticationManager">
        <security:authentication-provider user-service-ref="userDetailsService" />
    </security:authentication-manager>
    
    <bean id="userDetailsService"
        class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>
    Salin selepas log masuk
    Salin selepas log masuk
Di mana , / oauth/token ialah laluan yang digunakan untuk mendapatkan token akses, dan /api/** ialah laluan yang memerlukan pengesahan.

Apabila menggunakan OAuth2RestTemplate untuk menghantar permintaan, anda perlu mendapatkan token akses dahulu Kodnya adalah seperti berikut:

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(client, context);
AuthorizationCodeResourceDetails details = (AuthorizationCodeResourceDetails)client.getResource();
AuthorizationCodeAccessTokenProvider provider = new AuthorizationCodeAccessTokenProvider();
Authentication auth = new UsernamePasswordAuthenticationToken(username, password);
AccessTokenRequest tokenRequest = provider.createAccessTokenRequest(details, auth);
OAuth2AccessToken accessToken = provider.obtainAccessToken(details, tokenRequest);
restTemplate.getOAuth2ClientContext().setAccessToken(accessToken);
Salin selepas log masuk

Di mana klien ialah objek jenis OAuth2ProtectedResourceDetails, yang mengandungi maklumat seperti Client. ID dan Rahsia Pelanggan.

Mod Kata Laluan OAuth2

Cryptomode ialah jenis kebenaran dalam OAuth2 yang sesuai untuk mempercayai pelanggan Ia mengandungi langkah berikut:

Klien menghantar permintaan kepada Pelayan Kebenaran. , termasuk ID Pelanggan, Rahsia Pelanggan dan nama pengguna dan kata laluan Pemilik Sumber

Pelayan Kebenaran mengesahkan ID Pelanggan, Rahsia Pelanggan dan nama pengguna dan kata laluan, dan jika betul, mengeluarkan token akses kepada Pelanggan

Klien menggunakan Token akses menghantar permintaan kepada Pelayan Sumber.

  • Dalam pembangunan API Java, anda boleh menggunakan rangka kerja Spring Security OAuth2 untuk melaksanakan pengesahan mod kata laluan.
  • Pertama sekali, anda perlu menambah kebergantungan berikut dalam fail pom.xml:
  • <dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
        <version>2.3.4.RELEASE</version>
    </dependency>
    Salin selepas log masuk
    Salin selepas log masuk
  • Kemudian, tambahkan konfigurasi berikut dalam fail konfigurasi Spring MVC:
  • <security:http pattern="/oauth/token" create-session="stateless"
        authentication-manager-ref="authenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <security:intercept-url pattern="/oauth/token" access="isAuthenticated()" method="POST" />
        <security:anonymous enabled="false" />
        <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
        <security:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    </security:http>
    
    <security:http pattern="/api/**" create-session="never"
        entry-point-ref="oauthAuthenticationEntryPoint"
        access-decision-manager-ref="accessDecisionManager"
        xmlns="http://www.springframework.org/schema/security">
        <security:anonymous enabled="false" />
        <security:intercept-url pattern="/api/**" access="ROLE_USER" />
        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    </security:http>
    
    <bean id="clientAuthenticationEntryPoint"
        class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
        <property name="realmName" value="spring-boot-oauth2" />
        <property name="typeName" value="Basic" />
    </bean>
    
    <bean id="oauthAuthenticationEntryPoint"
        class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
        <property name="realmName" value="spring-boot-oauth2" />
        <property name="typeName" value="Bearer" />
    </bean>
    
    <bean id="oauthAccessDeniedHandler"
        class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
    
    <bean id="clientCredentialsTokenEndpointFilter"
        class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <bean id="resourceServerFilter"
        class="org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter">
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <bean id="accessDecisionManager"
        class="org.springframework.security.access.vote.UnanimousBased"
        xmlns="http://www.springframework.org/schema/beans">
        <constructor-arg>
            <list>
                <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
                <bean class="org.springframework.security.access.vote.RoleVoter" />
                <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            </list>
        </constructor-arg>
    </bean>
    
    <security:authentication-manager id="authenticationManager">
        <security:authentication-provider user-service-ref="userDetailsService" />
    </security:authentication-manager>
    
    <bean id="userDetailsService"
        class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>
    Salin selepas log masuk
    Salin selepas log masuk
Di mana , / oauth/token ialah laluan yang digunakan untuk mendapatkan token akses, dan /api/** ialah laluan yang memerlukan pengesahan.

Apabila menggunakan OAuth2RestTemplate untuk menghantar permintaan, anda perlu mendapatkan token akses dahulu Kodnya adalah seperti berikut:

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(details, new DefaultOAuth2ClientContext());
restTemplate.getOAuth2ClientContext().setAccessToken(accesstoken);
Salin selepas log masuk
Antaranya, butiran adalah objek jenis ResourceOwnerPasswordResourceDetails, termasuk ID Pelanggan. , Rahsia Pelanggan, nama pengguna dan kata laluan, dsb.

Ringkasan

Menggunakan OAuth2 untuk pengesahan dalam pembangunan API Java boleh melindungi keselamatan sumber API dan memudahkan pengguna membenarkan aplikasi pihak ketiga mengakses sumber pelayan mereka. Artikel ini memperkenalkan mod kod kebenaran dan mod kata laluan OAuth2 dan menyediakan kod sampel untuk melaksanakan pengesahan menggunakan rangka kerja Spring Security OAuth2. Semoga ia dapat membantu pembangun API Java.

Atas ialah kandungan terperinci Menggunakan pengesahan OAuth2 dalam pembangunan API Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan