簡體   English   中英

使用 OAuth2 保護服務,JWT 令牌不起作用 Spring 雲

[英]Protecting the service using OAuth2, JWT token not working Spring cloud

我有一個微服務架構。 我通過使用 OAuth2 保護服務並使用 JWT 令牌進行配置。 我在保護此微服務中的服務時遇到問題。 我已經成功實現了授權服務器。 我能夠生成 JWT 令牌並訪問授權服務器的受保護資源。

為了保護微服務,我做了以下事情:

  1. 在我想用 OAuth2 保護的微服務的 pom 文件中添加了依賴項:
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
  1. 修改了 boostrap 應用程序如下:
@SpringBootApplication
@EnableResourceServer
public class Application {

            ...
}
  1. 創建 JwtTokenConfiguration 如下:
    private String getPublicKeyAsString() {

        try {
            Resource resource = new ClassPathResource("publickey.pem");
//          return IOUtils.toString(oAuth2ConfigProperties.getJwt().getPublicKey().getInputStream(),
//                  StandardCharsets.UTF_8);
            String strPublicKey= ".....";
            String verifierKey = String.format("-----BEGIN CERTIFICATE-----\n%s\n-----END CERTIFICATE-----", strPublicKey);
                  //verifierKey = String.format("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----", strPublicKey);

            System.out.println(verifierKey);
            return verifierKey;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        jwtAccessTokenConverter.setVerifierKey(getPublicKeyAsString());
        return jwtAccessTokenConverter;
    }

錯誤如下:

    ... 33 common frames omitted
Caused by: java.lang.IllegalStateException: For MAC signing you do not need to specify the verifier key separately, and if you do it must match the signing key
    at org.springframework.util.Assert.state(Assert.java:73) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter.afterPropertiesSet(JwtAccessTokenConverter.java:318) ~[spring-security-oauth2-2.3.4.RELEASE.jar:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 53 common frames omitted

oauthcer.jks 位於授權服務器中。 我通過運行以下命令從 oauthcer.jks 生成了公眾:

keytool -list -rfc --keystore oauth2cer.jks

我從運行命令得到的結果如下:

-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIJAM8UC/xKlIfwMA0GCSqG ...
-----END CERTIFICATE-----

我在 url: https://8gwifi.org/PemParserFunctions.jsp中測試了結果,它工作正常。

我不知道為什么它不起作用。 我已經嘗試了很多東西。 我會感謝任何指南。

我也遇到過類似的問題。 您做錯了什么是將證書傳遞給: jwtAccessTokenConverter.setVerifierKey(getPublicKeyAsString()); . 您需要傳遞公鑰。

要解決此問題,您需要從 oauth2cer.jks 中提取公鑰。 執行以下命令提取公鑰:

keytool -list -rfc --keystore oauth2cer.jks | openssl x509 -inform pem -pubkey -noout

執行上面的命令后會顯示如下結果:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAdfsdfsdaxzcCAQ8AMIIBCgKCAQEAvJXQdLvlF1d
hx+AAzmNpuD89XPFAcmrvCt7CTGzi0bd/3WzK8dP2clxnVFANh7mbu24U91jK9ZS
3rewr4534tgfdryt54ytry6uyr
-----END PUBLIC KEY-----

上面的結果需要傳遞給 setVerifierKey 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM