当前位置: 首页 > 知识库问答 >
问题:

Spring Boot钥匙斗篷-承载:如何解决非承载:仅承载?

孙永思
2023-03-14
  • 有角度的v.v4。0.2
  • Spring靴1.5版。2.发布
  • 钥匙斗篷v.2。4.0.最终版本(稍后将升级)

我读了关于同样问题的邮件对话:http://keycloak-user.88327.x6.nabble.com/keycloak-user-NOT-ATTEMPTED-bearer-only-error-while-trying-to-access-server-from-client-td927.html和http://slackspace.de/articles/authentication-with-spring-boot-angularjs-and-keycloak/

我使用以下超文本传输协议服务进行授权请求:

@Injectable()
export class AuthHttpService extends Http {
  constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private authService: AuthService) {
    super(backend, defaultOptions);
  }

  private setToken(options: RequestOptionsArgs) {
    if (options == null || AuthService.auth == null || AuthService.auth.authz == null || AuthService.auth.authz.token == null) {
      console.log("Need a token, but no token is available, not setting bearer token.");
      return;
    }
    console.log(AuthService.auth.authz.token);
    options.headers.set('Authorization', 'Bearer ' + AuthService.auth.authz.token);
  }

  private configureRequest(f:Function, url:string | Request, options:RequestOptionsArgs, body?: any):Observable<Response> {
    let tokenPromise:Promise<string> = this.authService.getToken();
    let tokenObservable:Observable<string> = Observable.fromPromise(tokenPromise);
    let tokenUpdateObservable:Observable<any> = Observable.create((observer) => {
      if (options == null) {
        let headers = new Headers();
        options = new RequestOptions({ headers: headers });
      }

      this.setToken(options);
      observer.next();
      observer.complete();
    });
    let requestObservable:Observable<Response> = Observable.create((observer) => {
      let result;
      if (body) {
        result = f.apply(this, [url, body, options]);
      } else {
        result = f.apply(this, [url, options]);
      }

      result.subscribe((response) => {
        observer.next(response);
        observer.complete();
      }, (err) => observer.error(err));
    });

    return <Observable<Response>>Observable
      .merge(tokenObservable, tokenUpdateObservable, requestObservable, 1) 
      .filter((response) => response instanceof Response);
  }

...

应用性质

令牌已正确记录。

server.port = 8081

keycloak.realm = apprealm
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = appbackend
keycloak.bearer-only = true
keycloak.credentials.secret = ...

keycloak.securityConstraints[0].securityCollections[0].name = secure
keycloak.securityConstraints[0].securityCollections[0].authRoles[0]=frontenduser
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /r/s/*

logging.level.org.keycloak=DEBUG

我在前端使用的用户具有该角色。

后端错误

2017-04-22 15:40:00.517 DEBUG 14088 --- [nio-8081-exec-1] o.k.adapters.PreAuthActionsHandler       : adminRequest http://localhost:8081/r/s/e/p/m
2017-04-22 15:40:00.540 DEBUG 14088 --- [nio-8081-exec-1] o.k.a.a.ClientCredentialsProviderUtils   : Using provider 'secret' for authentication of client 'appbackend'
2017-04-22 15:40:00.543 DEBUG 14088 --- [nio-8081-exec-1] o.k.a.a.ClientCredentialsProviderUtils   : Loaded clientCredentialsProvider secret
2017-04-22 15:40:00.545 DEBUG 14088 --- [nio-8081-exec-1] o.k.a.a.ClientCredentialsProviderUtils   : Loaded clientCredentialsProvider jwt
2017-04-22 15:40:00.552 DEBUG 14088 --- [nio-8081-exec-1] o.k.a.a.ClientCredentialsProviderUtils   : Loaded clientCredentialsProvider secret
2017-04-22 15:40:00.553 DEBUG 14088 --- [nio-8081-exec-1] o.k.a.a.ClientCredentialsProviderUtils   : Loaded clientCredentialsProvider jwt
2017-04-22 15:40:00.625 DEBUG 14088 --- [nio-8081-exec-1] o.keycloak.adapters.KeycloakDeployment   : resolveUrls
2017-04-22 15:40:00.631 DEBUG 14088 --- [nio-8081-exec-1] o.k.adapters.KeycloakDeploymentBuilder   : Use authServerUrl: http://localhost:8080/auth, tokenUrl: http://localhost:8080/auth/realms/apprealm/protocol/openid-connect/token, relativeUrls: NEVER
2017-04-22 15:40:00.662 DEBUG 14088 --- [nio-8081-exec-1] o.k.adapters.RequestAuthenticator        : NOT_ATTEMPTED: bearer only
2017-04-22 15:40:00.681  INFO 14088 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-04-22 15:40:00.681  INFO 14088 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2017-04-22 15:40:00.723  INFO 14088 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 42 ms
2017-04-22 15:40:08.560 DEBUG 14088 --- [nio-8081-exec-2] o.k.adapters.PreAuthActionsHandler       : adminRequest http://localhost:8081/r/s/e/p/m
2017-04-22 15:40:08.560 DEBUG 14088 --- [nio-8081-exec-2] o.k.adapters.RequestAuthenticator        : NOT_ATTEMPTED: bearer only

编辑http

HTTP/1.1 401
Cache-Control: private
Expires: Thu, 01 Jan 1970 01:00:00 CET
WWW-Authenticate: Bearer realm="apprealm"
Access-Control-Allow-Origin: http://localhost:4200
Vary: Origin
Access-Control-Allow-Methods: GET,POST,PUT,DELETE
Access-Control-Allow-Headers: authorization, content-type
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1800
Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Content-Length: 0
Date: Sun, 23 Apr 2017 17:04:07 GMT

编辑2:http原始请求

OPTIONS http://localhost:8081/r/p/main HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Access-Control-Request-Method: PUT
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Access-Control-Request-Headers: authorization,content-type
Accept: */*
Referer: http://localhost:4200/b
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4

会有什么问题?

共有1个答案

端木兴国
2023-03-14

我刚刚遇到了这个错误,这是因为授权标头在实际令牌之前缺少文本“bearer”。

 类似资料:
  • 不知何故,我迷失了Spring Security和Keycloak。 在一个应用程序中,我成功地从KeyClope实例接收了一个访问令牌。然后,我使用这个令牌请求我的Spring Security服务器(它使用相同的KeyClope实例)。 但我得到的只是403个错误。 以下是代码摘录(用kotlin编写): 安全配置: 在我的控制器中: 在我对服务器的调用中,我可以验证授权头的设置如下:auth

  • 我正在尝试在API网关(Apache APISIX)后面使用KeyClope。 我使用minikube来运行KeyClope和API网关。 网关正常工作,KeyClope也正常工作: 使用KeyClope,我可以使用不同的endpoint(使用发现endpoint(http://127.0.0.1:7070/auth/realms/myrealm/.well-已知/uma2配置),询问访问令牌并进

  • 我有java REST应用程序,我希望通过keycloak保护。我做了一些测试,应用程序与keycloak servlet过滤器配合良好,但我在Spring Security适配器方面遇到了问题。 钥匙斗篷。json(删除值) 可见,我只需要承载授权,若请求包含有效令牌,那个么若不是http 401,那个么我希望是http 200。我使用了以下xml配置: 到底发生了什么?请求经过身份验证,但成功

  • 我正在开发一个连接到java(Spring框架)后端的角webapp。身份验证是通过密钥斗篷服务器完成的。 在我的带有嵌入式tomcat服务器的本地机器上,angular应用程序和spring应用程序运行正常。 对于部署,我需要使用传统的方式,使用现有的tomcat服务器。 角度前端在根目录中通过http://myurl/spring后端作为war文件放置,可以通过http://myurl/api

  • 我用这个例子:https://github.com/foo4u/keycloak-spring-demo 我有钥匙斗篷。json文件在我的WEB-INF文件夹中,但当我运行应用程序时,会出现以下异常: 此异常的完整堆栈: 这段代码只是Spring Boot和KeyCloak集成的一个例子。 你能告诉我我做错了什么吗? 谢谢你的回答和时间。