>  기사  >  OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제

OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제

WBOY
WBOY앞으로
2024-02-13 15:51:09973검색

OAuth 2.0 리소스 서버 JWT를 사용할 때 권한(인증) 문제가 발생할 수 있습니다. 이는 많은 개발자가 개발 과정에서 자주 직면하는 문제입니다. OAuth 2.0은 사용자가 타사 애플리케이션에 보호된 리소스에 액세스할 수 있는 권한을 부여할 수 있는 개방형 인증 표준입니다. JWT(JSON 웹 토큰)는 웹 애플리케이션 간에 클레임을 전달하는 방법입니다. 그러나 실제로는 인증 실패, 액세스 토큰 획득 실패 등 일부 권한 문제가 발생할 수 있습니다. 이 기사에서는 이러한 문제를 분석하고 개발자가 OAuth 2.0 리소스 서버 JWT를 더 잘 사용하는 데 도움이 되는 몇 가지 솔루션을 제공합니다.

질문 내용

간단한 애플리케이션에서 oauth 2.0 리소스 서버 jwt를 사용하여 접근 권한을 구성하려고 합니다.

전체 인증 부분은 잘 작동하지만 인증에 문제가 있습니다. 토큰에 올바른 권한이 있더라도 모든 보호된 엔드포인트에서는 403 forbidden 오류가 발생합니다.

기본 범위(scope_) 속성을 사용하고 구성을 역할(role_)로 변경해 보았지만 문제가 지속됩니다.

혹시 해결방법 아시는 분 계신가요?

전체 소스 코드: https://github.com/gustavosc1/spring-security-jwt

토큰 생성 예시: eyjhbgcioijsuzi1nij9.eyjpc3mioijzchjpbmctc2vjdxjpdhktand0iiwic3viijoidxnlcm5hbwuilcjlehaioje3mdu0ndmyotqsimlhdci6mtcwntqwnzi5ncwicm9szxmi oijst0xfx0 fe tuloin0.peivwrthx_7mr6eefqbid5dplhffzcvd7scmmt3f7rk7sk1i6kerpqi5ubdvaefnzsjq6vka5nadltsbqidfzogmoixjktfhsc5zrnyyrhikvnwcwb3wrgdd1ezgihaldfjxwxsyypau njwdxznirkl93e6mg1ua o 5piy9p-9yp8jer7o31wkdr1coskzk3gqw42uecib9h1rrlkx9pdk7pf9rtfssfcwc-ntvismrycreco9rialqfydpdzeojimcbqveyboqfhn2woepgdm8mr5zsdhgdq e1ivsibfbcj_0486zuqiksxp2knil j hl2b5qnan07fjpvslk--ccsg

보안 구성:

으아아아

userdetailsserviceimpl:

으아아아

사용자 확인:

으아아아

jwtservice:

으아아아

개인 컨트롤러:

@configuration
@enablewebsecurity
//@enablemethodsecurity(prepostenabled = true)
public class securityconfig {
  @value("${jwt.public.key}")
  private rsapublickey key;
  @value("${jwt.private.key}")
  private rsaprivatekey priv;

  @bean
  securityfilterchain filterchain(httpsecurity http) throws exception {
    http.csrf(csrf -> csrf.disable())
        .authorizehttprequests(
            auth -> auth
                .requestmatchers("/authenticate").permitall()
                .requestmatchers("/register").permitall()
                .requestmatchers("/private").hasanyrole("admin"))
        .httpbasic(customizer.withdefaults())
        
        // https://docs-spring-io.translate.goog/spring-security/reference/servlet/oauth2/resource-server/jwt.html?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-br&_x_tr_pto=sc
        .oauth2resourceserver(
                conf -> conf.jwt(
                    jwt -> jwt.decoder(jwtdecoder())
                    .jwtauthenticationconverter(jwtauthenticationconverter())));
                
    return http.build();
  }
  
  @bean
  public jwtauthenticationconverter jwtauthenticationconverter() {
      jwtgrantedauthoritiesconverter grantedauthoritiesconverter = new jwtgrantedauthoritiesconverter();
      grantedauthoritiesconverter.setauthoritiesclaimname("roles");
      grantedauthoritiesconverter.setauthorityprefix("role_");

      jwtauthenticationconverter jwtauthenticationconverter = new jwtauthenticationconverter();
      jwtauthenticationconverter.setjwtgrantedauthoritiesconverter(grantedauthoritiesconverter);
      return jwtauthenticationconverter;
  }

  @bean
  jwtdecoder jwtdecoder() {
    return nimbusjwtdecoder.withpublickey(this.key).build();
  }

  @bean
  jwtencoder jwtencoder() {
    jwk jwk = new rsakey.builder(this.key).privatekey(this.priv).build();
    jwksource<securitycontext> jwks = new immutablejwkset<>(new jwkset(jwk));
    return new nimbusjwtencoder(jwks);
  }
  
  @bean
  passwordencoder passwordencoder() {
    return new bcryptpasswordencoder();
  }
  
}

Workaround

가 제공된 토큰을 생성했으며 roles 字段设置为 ROLE_ADMIN。在 jwtAuthenticationConverter() 中,您尝试将 setAuthorityPrefixROLE 一起使用,导致 ROLE_ROLE_ADMIN.

이 문제를 수정하려면 줄을 grantedAuthoritiesConverter.setAuthorityPrefix("");로 변경하세요.

이 조정을 수행한 후에는 문제가 해결되어야 합니다. 다른 문제가 발생하면 알려주시기 바랍니다.

주의:

이 단계를 생략하면 기본 접두사는 SCOPE,导致您的角色变为 SCOPE_ROLE_ADMIN가 됩니다.

위 내용은 OAuth 2.0 리소스 서버 JWT를 사용하는 권한(승인) 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제