首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用keycloak、oauth2和仪表板-错误403无效请求-无效范围

如何使用keycloak、oauth2和仪表板-错误403无效请求-无效范围
EN

Stack Overflow用户
提问于 2020-10-29 17:07:10
回答 1查看 3.3K关注 0票数 3

我正在尝试使用键盘与Oauth2来保护kubernetes-仪表板。我找到了几个关于这个错误的帖子,但是没有一个是针对我的问题的。也许我只是错过了一个简单的步骤。

到目前为止,我遵循了以下指南:https://jamesveitch.com/homelab/02.idam/02.keycloak/

keycloak安装在名称空间Keycloak内的kubernetes集群中。kubernetes-仪表板安装在名称空间kubernetes-仪表板中。

在auth.mydomain.com下可以找到密钥披风,而仪表板应该在dashboard.mydomain.com下实现。

我已经创建了一个用户“测试”,并分配了一个组kubernetes-admin,用于授予对仪表板的访问权限。

我将Keycloak配置如下:

kubernetes-admin

  • Created

  • 创建了一个新的领域“dev”

  • Created一个新的客户端“仪表板”
  • 访问类型:已启用的confidential
  • Service帐户:on
  • 有效重定向Url:https://dashboard.mydomain.com/oauth/callback
  • Created a Mapper for group (类型:组成员资格,TokenClaimName:groups)

)

对于kubernetes的集群绑定-admin,我使用这个yaml:

代码语言:javascript
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: keycloak-admin-group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  # NOTE: This is a super administrator and can do everything.
  # Consider a dedicated role in your actual operation.
  name: cluster-admin
subjects:
- kind: Group
  name: kubernetes-admin

对于OAuth2和Ingress的配置,我使用:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    ingress.kubernetes.io/ssl-redirect: "true"
    ingress.kubernetes.io/use-port-in-redirects: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
  name: dashboard
  namespace: kubernetes-dashboard
spec:
  tls:
  - hosts:
    - dashboard.mydomain.com
    secretName: dashboard.mydomain.com-tls
  rules:
  - host: dashboard.mydomain.com
    http:
      paths:
      - backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
        path: /
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: oauth2-proxy
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: dashboard.mydomain.com
    http:
      paths:
      - backend:
          serviceName: oauth2-proxy
          servicePort: 4180
        path: /oauth2
  tls:
  - hosts:
    - dashboard.mydomain.com
    secretName: dashboard.mydomain.com-tls
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: oauth2-proxy
  template:
    metadata:
      labels:
        k8s-app: oauth2-proxy
    spec:
      containers:
      - args:
        - --provider=keycloak
        - --client-id=dashboard
        - --client-secret=a27b97fb-eafc-420c-88ba-8017beb54180
        - --login-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/auth
        - --redeem-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/token
        - --validate-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/userinfo
        - --keycloak-group=kubernetes-admin
        - --email-domain=*
        - --http-address=0.0.0.0:4180
        - --reverse-proxy=true
        - --pass-access-token=true
        - --set-xauthrequest=true
        - --ssl-insecure-skip-verify=true
        - --ssl-upstream-insecure-skip-verify=true
        - --cookie-domain=.mydomain.com
        - --whitelist-domain=.mydomain.com
        - --upstream=https://kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local
        # Register a new application
        # https://github.com/settings/applications/new
        env:
        # docker run -ti --rm python:3-alpine python -c 'import secrets,base64;     print(base64.b64encode(base64.b64encode(secrets.token_bytes(16))));'
        - name: OAUTH2_PROXY_COOKIE_SECRET
          value: ekNsWlN6MkphVVVmTnNZUTBEZnZVQT09
        image: quay.io/oauth2-proxy/oauth2-proxy
        imagePullPolicy: Always
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: kubernetes-dashboard
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    k8s-app: oauth2-proxy

此yaml文件用于带有letsencrypt暂存的开发环境,应该忽略ssl错误。

工作的是,我可以打开https://dashboard.mydomain.com/oauth2/signin和按下Sigin与密钥披风。但是接下来我要重定向到403权限错误页。/oauth2/callback?error=invalid_request&error_description=Invalid+scopes日志上的oauth2日志显示:错误

请记住,我想使用上游的kubernetes仪表板服务。这就是为什么我在这里尝试作为上游https://kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local.。希望这是对的?

我怎么解决这个问题??有什么想法吗?密钥披风配置正确吗?

有些网站说要使用(https://*http://*作为有效的urls)。(没有运气的尝试)

希望有人能帮忙..。到目前为止,我确实花了很多时间来完成这项工作。但到目前为止还没有运气。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 13:37:56

我刚刚发现了如何处理这个错误:

首先,我们需要将密钥披风中的URL更改为https://dashboard.mydomain.com/*。

  1. 下的仪表板- Mapper -组停用完整的组路径。这将移除令牌中组的前导斜杠(您可以在Client评估处检查),这对于--keycloak-group=kubernetes-admin

参数oauth2是必需的。

  1. 在dev领域下创建一个客户端作用域“用户”--在具有默认值

的客户端Scopes上。

  1. 现在更改为Client下的第二个选项卡“默认客户范围”,并将“用户”指定为默认客户范围

  1. 在Client ->仪表板- Client Scope

下添加此客户范围“用户”。

--scope=users

  1. 将-scope参数添加到oauth2开发中

上游是正确的辅助在上面的样本,以访问仪表板直接内的俱乐部。所以那里不需要改变。

在此之后,您应该能够打开仪表板没有错误。但是,我仍然有一个问题,就是发送了承载令牌,但目前还没有自动登录。你还得粘贴你的记号。所以我还在调查这份工作..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64595962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档