AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • Início
    • system&network
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

Perguntas[keycloak](coding)

Martin Hope
Ni2Be
Asked: 2025-03-08 02:07:37 +0800 CST

Guia de permissões do KeyCloak 26.1.3 não visível

  • 5

Estou tentando configurar a troca de tokens para um aplicativo Teams Tab e quero configurar o KeyCloak para poder trocar os tokens Entra por tokens KeyCloak.

Eu habilitei

  • KC_FEATURE=visualização,troca de tokens,admin-fine-grained-authz

e parece que está ativo:

./opt/keycloak/bin/kc.sh show-config
:
kc.feature =  preview,token-exchange,admin-fine-grained-authz (ENV)
:

Mas quando estou no console de administração ainda não consigo ver a aba Permissões: insira a descrição da imagem aqui

Estou usando quay.io/keycloak/keycloak:26.1.3

O que estou perdendo?

Arquivos:
services:
  idp2-database:
    image: postgres:17.0
    volumes:
      - ./docker-volumes/userDatabase2:/var/lib/postgresql/data
    restart: always
    ports:
      - "45001:5432"
    environment:
      POSTGRES_DB: userDb
      POSTGRES_USER: keycloakUser
      POSTGRES_PASSWORD: keycloakUser
    container_name: idp2-database
    networks:
      - keycloak2-and-postgres-network
    healthcheck:
      test: ["CMD", "psql", "-U", "keycloakUser", "-d", "userDb", "-c", "SELECT 1"]
      interval: 10s
      timeout: 5s
      retries: 5

  idp2-keycloak:
    image: quay.io/keycloak/keycloak:26.1.3
    container_name: idp2-keycloak
    restart: always
    command: ["start", "--https-certificate-file=/opt/keycloak/certs/tls.crt", "--https-certificate-key-file=/opt/keycloak/certs/tls.key", "--spi-theme-static-max-age=-1", "--spi-theme-cache-themes=false", "--spi-theme-cache-templates=false"]
    environment:
      # features (token-exchange, admin-fine-grained-authz)
      - KC_FEATURE=preview,token-exchange,admin-fine-grained-authz

      # admin user
      - KEYCLOAK_ADMIN=admin
      - KEYCLOAK_ADMIN_PASSWORD=admin

      # database
      - KC_DB=postgres
      - KC_DB_URL=jdbc:postgresql://idp2-database:5432/userDb
      - KC_DB_USERNAME=keycloakUser
      - KC_DB_PASSWORD=keycloakUser

      # health
      - KC_HEALTH_ENABLED=true

      # logging
      - KEYCLOAK_LOGLEVEL=DEBUG

      # hosting
      - KC_HOSTNAME=localhost
      - KEYCLOAK_FRONTEND_URL=https://localhost:45000/auth
      - KC_HOSTNAME_STRICT=false
      - KC_HOSTNAME_STRICT_HTTPS=true
      - KC_HTTP_ENABLED=false
      - KC_HTTPS_PORT=8443
      # - KC_HTTP_MAX_HEADER_SIZE=32768 
      - QUARKUS_HTTP_HTTP2=false
      
    ports:
      - "45000:8443"
    volumes:
      - ./docker-volumes/keycloak2/standalone/data:/opt/keycloak/standalone/data
      - ./docker-volumes/keycloak2/certs:/opt/keycloak/certs
      - ../src/themes:/opt/keycloak/themes
      - ./docker-volumes/keycloak2/providers:/opt/keycloak/providers
      - ./docker-volumes/keycloak2/standalone/configuration:/opt/keycloak/standalone/configuration
    depends_on:
      idp2-database:
        condition: service_healthy
    networks:
      - keycloak2-and-postgres-network

networks:
  keycloak2-and-postgres-network:

trecho de certificado:

openssl req -newkey rsa:2048 -nodes \
  -keyout ./docker-volumes/keycloak/certs/tls.key \
  -x509 -days 365 \
  -out ./docker-volumes/keycloak/certs/tls.crt \
  -subj "/CN=localhost" \
  -addext "subjectAltName=DNS:localhost,DNS:127.0.0.1"
keycloak
  • 1 respostas
  • 30 Views
Martin Hope
mohamed amine salah
Asked: 2024-11-19 01:06:11 +0800 CST

O nonce está faltando no id_token na resposta

  • 6

Estou usando o Keycloak 21 para autenticação e estou tendo um problema em que o valor nonce não está incluído no id_token retornado após eu invocar /token. Estou passando o nonce na solicitação /auth,

keycloak
  • 1 respostas
  • 30 Views
Martin Hope
mascai
Asked: 2024-11-11 04:48:32 +0800 CST

"Token inválido" no keycloak

  • 6

Estou tentando usar keycloak no meu aplicativo FastAPI Meu código

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError
from keycloak import KeycloakOpenID
import requests
import logging
import os

from .config import settings


# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Keycloak configuration
KEYCLOAK_SERVER_URL = settings.KEYCLOAK_SERVER_URL
KEYCLOAK_REALM = settings.KEYCLOAK_REALM
KEYCLOAK_CLIENT_ID = settings.KEYCLOAK_CLIENT_ID
KEYCLOAK_CLIENT_SECRET = settings.KEYCLOAK_CLIENT_SECRET
ALGORITHM = "RS256"
TOKEN_URL = f"{KEYCLOAK_SERVER_URL}/realms/fastapi-realm/protocol/openid-connect/token"


# Initialize KeycloakOpenID
keycloak_openid = KeycloakOpenID(
    server_url=f"{KEYCLOAK_SERVER_URL}",
    client_id=KEYCLOAK_CLIENT_ID,
    realm_name=KEYCLOAK_REALM,
    client_secret_key=KEYCLOAK_CLIENT_SECRET,
    verify=False
)
config_well_known = keycloak_openid.well_known()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def verify_token(token: str = Depends(oauth2_scheme)):
    try:
        decoded_token = keycloak_openid.decode_token(
            token,validate=True,
        )
        username = decoded_token['preferred_username']
        logger.info(f"Decoded token: {decoded_token}")
        # Verify the issuer claim
        issuer = decoded_token["iss"]

        expected_issuer = f"{KEYCLOAK_SERVER_URL}/realms/{KEYCLOAK_REALM}"
        I# Token example -- token: {'exp': 1731303036, 'iat': 1731267036, 'jti': 'f1b71d25-4de6-4c03-b5f5-d9726b39d51f', 'iss': 'https://feast-keycloak.pimc-st.innodev.local/realms/feast-realm', 'aud': 'account', 'sub': 'ac48f45e-f26b-4380-bde8-e752febb6d18', 'typ': 'Bearer', 'azp': 'feast-client-id', 'session_state': 'b36cd197-247d-447e-9f3d-6cf1fecae7d6', 'acr': '1', 'allowed-origins': ['https://feast-frontend.pimc-st.innodev.local', '/*', 'http://localhost:5173'], 'realm_access': {'roles': ['default-roles-feast-realm', 'offline_access', 'uma_authorization']}, 'resource_access': {'account': {'roles': ['manage-account', 'manage-account-links', 'view-profile']}}, 'scope': 'profile email', 'sid': 'b36cd197-247d-447e-9f3d-6cf1fecae7d6', 'email_verified': False, 'name': 'A B', 'preferred_username': 'my_username', 'given_name': 'A', 'family_name': 'B', 'email': '[email protected]'}
        logger.info(f"XXX_ issuer={issuer}")
        logger.info(f"XXX_ expected_issuer={expected_issuer}")
        if issuer != expected_issuer:
            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid issuer")
        
        logger.info(f"username: {username}")
        return decoded_token
    except Exception as e:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")

No meu main.py tenho o seguinte código

from fastapi import Depends, FastAPI, HTTPException, status, Security


from .keycloak import verify_token, oauth2_scheme, KEYCLOAK_CLIENT_ID, KEYCLOAK_CLIENT_SECRET, TOKEN_URL

app = FastAPI()

@app.post("/project", response_model=schemas.Project, tags=["project",])
def create_project(project: schemas.CreateProject, db: Session = Depends(get_db), payload: dict = Security(verify_token)):
    ...


@app.post("/login")
def get_token(body: schemas.Login):
    data = {
        "grant_type": "password", # TODO: clarify grant_type client_credentials (requires only client id and secret or password - requires password and login)
        "client_id": KEYCLOAK_CLIENT_ID,
        "client_secret": KEYCLOAK_CLIENT_SECRET,
        "password": body.password,
        "username": body.login
    }
    response = requests.post(TOKEN_URL, data=data,  verify=False)
    return JSONResponse(status_code=response.status_code, content=response.json())

Estou obtendo o token com a ajuda do método /login. Então estou aplicando o token assim: insira a descrição da imagem aqui

Para solicitação /projecttenho um erro:

"Token inválido"

Como corrigir o erro?

keycloak
  • 1 respostas
  • 41 Views
Martin Hope
mascai
Asked: 2024-10-24 19:03:56 +0800 CST

client-credentials é unsupported_grant_type

  • 6

Estou criando o aplicativo FastApi + KeyCloak. Criei o realm, o cliente e o usuário

Configuração do cliente insira a descrição da imagem aqui

Minha configuração de usuário insira a descrição da imagem aqui

Posso obter token com a ajuda desta solicitação

insira a descrição da imagem aqui

Mas para grant_type client-credentialstenho um erro:

{
    "error": "unsupported_grant_type",
    "error_description": "Unsupported grant_type"
}

Qual é a diferença entre "password" e "client-credentials"? E como dar suporte a client-credentials?

keycloak
  • 1 respostas
  • 16 Views
Martin Hope
alexanoid
Asked: 2024-09-02 16:26:56 +0800 CST

StackOverflow com Keycloak como provedor de login retorna endereço de e-mail vazio

  • 3

Na minha configuração do Keycloak, o StackOverflow está configurado como um dos provedores de login. Recentemente, notei que novos usuários não conseguem se registrar no meu site via StackOverflow porque o e-mail retornado é nulo. Qual pode ser o motivo disso?

keycloack.versão 18.0.2

2024-09-02 10:39:51,276 WARN  [org.keycloak.services] (executor-thread-11964) KC-SERVICES0020: Email is null. Reset flow and enforce showing reviewProfile page
2024-09-02 10:39:51,276 WARN  [org.keycloak.services] (executor-thread-11964) KC-SERVICES0013: Failed authentication: org.keycloak.authentication.AuthenticationFlowException
    at org.keycloak.authentication.AuthenticationProcessor.authenticateOnly(AuthenticationProcessor.java:1038)
    at org.keycloak.services.resources.LoginActionsService$1.authenticateOnly(LoginActionsService.java:808)
    at org.keycloak.authentication.AuthenticationProcessor.authenticate(AuthenticationProcessor.java:892)
    at org.keycloak.services.resources.LoginActionsService.processFlow(LoginActionsService.java:323)
    at org.keycloak.services.resources.LoginActionsService.brokerLoginFlow(LoginActionsService.java:838)
    at org.keycloak.services.resources.LoginActionsService.firstBrokerLoginGet(LoginActionsService.java:732)
    at jdk.internal.reflect.GeneratedMethodAccessor343.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
    at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:660)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:524)
    at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:474)
    at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:476)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:434)
    at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:192)
    at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:141)
    at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:32)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)
    at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)
    at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
    at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)
    at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:151)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.handle(VertxRequestHandler.java:82)
    at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.handle(VertxRequestHandler.java:42)
    at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1212)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:163)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:141)
    at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:67)
    at io.quarkus.vertx.http.runtime.StaticResourcesRecorder$2.handle(StaticResourcesRecorder.java:55)
    at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1212)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:163)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:141)
    at io.quarkus.vertx.http.runtime.VertxHttpRecorder$5.handle(VertxHttpRecorder.java:380)
    at io.quarkus.vertx.http.runtime.VertxHttpRecorder$5.handle(VertxHttpRecorder.java:358)
    at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1212)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:163)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:141)
    at org.keycloak.quarkus.runtime.integration.web.QuarkusRequestFilter.lambda$createBlockingHandler$1(QuarkusRequestFilter.java:71)
    at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:159)
    at io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:157)
    at io.quarkus.vertx.core.runtime.VertxCoreRecorder$13.runWith(VertxCoreRecorder.java:543)
    at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
    at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
    at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)

2024-09-02 10:39:51,277 WARN  [org.keycloak.events] (executor-thread-11964) type=IDENTITY_PROVIDER_FIRST_LOGIN_ERROR
keycloak
  • 1 respostas
  • 31 Views
Martin Hope
Vinod Louis
Asked: 2024-07-31 20:11:15 +0800 CST

Erro de troca de token Keycloak - O cliente não está dentro do público do token

  • 6

Estou trabalhando em uma solicitação de troca de token do keycloak em que tento obter o token de acesso do cliente2 enquanto sou autenticado com o cliente1.

Habilitei token_exchange e admin_fine_grained_authz na instância keycloak.

Seguiu a documentação de https://www.keycloak.org/docs/latest/securing_apps/index.html#_internal-token-to-internal-token-exchange

Quando eu acessei a API para troca de tokens como

curl --location 'http://<URL>/realms/Genting/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=client2' \
--data-urlencode 'client_secret=<client2 secret>' \
--data-urlencode 'subject_token=<client1 token> \
--data-urlencode 'audience=client2' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:access_token' 

Em resposta, estou recebendo

{
    "error": "access_denied",
    "error_description": "Client is not within the token audience"
} 

Há alguma configuração que perdi aqui para receber o token corretamente?

keycloak
  • 1 respostas
  • 18 Views
Martin Hope
Pawel Zieminski
Asked: 2024-03-15 04:43:19 +0800 CST

Como listar usuários de contas de serviço no keycloak

  • 6

Existe uma maneira de listar usuários de contas de serviço usando a API Keycloak (19.x)?

Posso listar usuários usando GET /admin/realms/{realm}/userse posso acessar uma conta de usuário de serviço usando GET /admin/realms/{realm}/users/{service-account-user-id}, se eu tiver esse ID de, digamos, um evento de login do usuário, mas existe uma maneira de listá-los?

Tudo que preciso são seus IDs e valores de nome de usuário.

Examinei a documentação disponível da API REST do Keycloak e não consegui vê-la em /admin/realms/{realm}/usersou /admin/realms/{realm}/clients. Também não há eventos de criação e atualização correspondentes quando esses usuários são criados invertendo contas de serviço habilitadas em um cliente.

keycloak
  • 2 respostas
  • 19 Views
Martin Hope
Альберт Александров
Asked: 2023-08-17 21:15:48 +0800 CST

Criar usuário via API no KeyCloak sem admin-cli?

  • 7

Imagine que um reino my-realme um cliente my-clientforam criados. É possível criar usuários via API sem admin-cli (com segredo do my-clientcliente)?

keycloak
  • 1 respostas
  • 20 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve