Как получить дополнительные претензии от входа клиента OpenIDConnect в OpenLiberty - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь получить конкретное c требование от токена, используя функцию OpenIDConnectClient в открытой свободе. Пользователь сопоставлен правильно, как и роли (утверждение группы), но я не могу получить указанное утверждение c. OpenIDConnectClient подключается к области KeyCloak.

Мой сервер. xml:

<?xml version="1.0" encoding="UTF-8"?>
<server description="${project.name}">

    <featureManager>
<!--         <feature>microProfile-3.2</feature> -->
        <feature>appSecurity-3.0</feature>
        <feature>transportSecurity-1.0</feature>
        <feature>openIDConnectClient-1.0</feature>
        <feature>jaxrs-2.1</feature>
        <feature>mpJwt-1.1</feature>
        <feature>cdi-2.0</feature>
        <feature>jwtSso-1.0</feature>
    </featureManager>

    <httpEndpoint id="defaultHttpEndpoint"
                  httpPort="9080"
                  httpsPort="9443"/>

    <webApplication location="${project.name}.war" contextRoot="/">
        <classloader apiTypeVisibility="+third-party" />
    </webApplication>

    <openidConnectClient id="cdoMondaine"
        clientId="cdo-mondaine"
        clientSecret="****"
        discoveryEndpointUrl="https://example.server.com/auth/realms/esdl-mapeditor/.well-known/openid-configuration"
        signatureAlgorithm="RS256"
        scope="openid profile email groups user_group microprofile-jwt"
        userNameAttribute="email"
        userIdentifier="email"
        userIdentityToCreateSubject="email" 
        groupNameAttribute="groups"
        groupIdentifier="groups"
        userInfoEndpointEnabled="true"
        authFilterRef="dataUrl">
    </openidConnectClient>


    <jwtSso includeLtpaCookie="true" jwtBuilderRef="myBuilder" setCookieSecureFlag="false"></jwtSso>            
    <jwtBuilder id="myBuilder" 
        issuer="https://example.server.com/auth/realms/esdl-mapeditor"
        scope="openid profile email groups user_group microprofile-jwt">
        <claims>name,aud,user_group,groups,upn</claims>
        <audiences>cdo-mapeditor</audiences>
    </jwtBuilder>       
    <mpJwt id="myMpJwt" 
        issuer="https://example.server.com/auth/realms/esdl-mapeditor"
        jwksUri="https://example.server.com/auth/realms/esdl-mapeditor/protocol/openid-connect/certs"
        audiences="cdo-mapeditor" 
        />

    <authFilter id="dataUrl">
         <requestUrl id="requestUrl" urlPattern="/data" matchType="contains"/>
    </authFilter>

    <!-- This is the keystore that will be used by SSL and by JWT. -->
    <keyStore id="defaultKeyStore" location="public.p12" type="PKCS12" password="*****" />



    <!-- com.ibm.ws.webcontainer*=all:HTTPChannel=all:GenericBNF=all -->
    <logging traceSpecification="com.ibm.ws.webcontainer*=all:com.ibm.ws.security.*=all=enabled:nl.tno.*=all" /> <!-- maxFiles="8" maxFileSize="200"  -->

</server>

В журналах трассировки я вижу, что токен получен правильно (после страницы входа в Keycloak). Как видите, я сопоставил токен с помощью jwtBuilder с токеном mpJWT, но утверждения не скопированы. Как я могу получить доступ к претензии user_group в коде? user_group - это массив JSON в токене.

1 Ответ

0 голосов
/ 08 апреля 2020

Вам может потребоваться настроить следующую конфигурацию, если имя заявки группы в id_token равно "user_group". Вы всегда устанавливаете groupIdentifier на имя заявки.

Удаляет следующие два атрибута с сервера. xml groupNameAttribute="groups" groupIdentifier="groups" и заменяет их на groupIdentifier="user_group".

Опция 1:

`Suject sujb = com.ibm.websphere.security.auth.WSSubject.getRunAsSubject();`    
`Iterate through subject, until find  com.ibm.websphere.security.cred.WSCredential`    
`use method getGroupIds() to find all groups.`    

Вариант 2: com.ibm.websphere.security.openidconnect.token.IdToken idToken
com.ibm.websphere.security.openidconnect.PropagationHelper.getIdToken();
idToken.getClaim("claim_name");

...