Keycloak - Node.js - Как применить принудительное применение политики в приложении node.js? - PullRequest
0 голосов
/ 18 марта 2020

Я писал уже другие вопросы по переполнению стека об этой проблеме. И нет решения для его решения.

Я хочу защитить конечную точку с применением политики. Мой тест выполняется с помощью "ineat-admin"

ресурсов настройки на сервере keycloak:

{
  "allowRemoteResourceManagement": true,
  "policyEnforcementMode": "ENFORCING",
  "resources": [
    {
      "name": "Default Resource",
      "type": "urn:api-passerelle-test:resources:default",
      "ownerManagedAccess": false,
      "attributes": {},
      "_id": "c9834687-0b79-4f24-be84-1320cc6b0ea5",
      "uris": [
        "/jemetsuneuribidon"
      ]
    },
    {
      "name": "ressource-manteau",
      "ownerManagedAccess": false,
      "displayName": "ressource-manteau",
      "attributes": {},
      "_id": "6e613882-2bbe-4f6e-a7ea-03f95f80236c",
      "uris": [
        "/*"
      ],
      "scopes": [
        {
          "name": "view"
        }
      ]
    }
  ],
  "policies": [
    {
      "id": "d777cfed-cafb-41b0-a99b-c3ea83528454",
      "name": "Default Policy",
      "description": "A policy that grants access only for users within this realm",
      "type": "js",
      "logic": "POSITIVE",
      "decisionStrategy": "AFFIRMATIVE",
      "config": {
        "code": "// by default, grants any permission associated with this policy\n$evaluation.grant();\n"
      }
    },
    {
      "id": "4f99964b-8e20-4008-8cdb-313f84445c96",
      "name": "est-ineat-admin",
      "type": "user",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "users": "[\"ineat-admin\"]"
      }
    },
    {
      "id": "3e5312ba-2f48-49d2-94d0-77acbfe9e545",
      "name": "Default Permission",
      "description": "A permission that applies to the default resource type",
      "type": "resource",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "defaultResourceType": "urn:api-passerelle-test:resources:default",
        "applyPolicies": "[\"Default Policy\"]"
      }
    },
    {
      "id": "075d1754-384c-4663-8a74-560bf86b95c2",
      "name": "perm-view--ressource-manteau",
      "type": "scope",
      "logic": "POSITIVE",
      "decisionStrategy": "UNANIMOUS",
      "config": {
        "resources": "[\"ressource-manteau\"]",
        "scopes": "[\"view\"]",
        "applyPolicies": "[\"est-ineat-admin\"]"
      }
    }
  ],
  "scopes": [
    {
      "id": "077a3e01-72bc-4cee-9d6a-c4e19cb32405",
      "name": "view"
    },
    {
      "id": "4228de3b-93e9-4581-975e-6b05664c59f2",
      "name": "create"
    }
  ],
  "decisionStrategy": "UNANIMOUS"
}

Node.js API:

const keycloak = new Keycloak({
  store: memoryStore
}, kcConfig);
app.use(
  keycloak.middleware({
    logout: '/logout',
    admin: '/',
    protected: '/api/protected/resource'
  })
);


  app.get('/api/protected/resource', keycloak.enforcer(['ressource-manteau:view'], {
    resource_server_id: 'api-passerelle-test'
  }), function (req, res) {
    res.json({
      result: JSON.stringify(JSON.parse(req.session['keycloak-token']), null, 4),
      event: '1. Access granted to Default Resource\n'
    });
  });

В jwt, отправленном в заголовок «Авторизация» http-запроса:

{
  "jti": "0cf5b9a1-922b-4379-9de5-5c584982499b",
  "exp": 1584531919,
  "nbf": 0,
  "iat": 1584531619,
  "iss": "http://192.168.99.100:8103/auth/realms/realm-test",
  "aud": "account",
  "sub": "7e6258d4-ffc8-4694-9ec3-0ba4f51967a9",
  "typ": "Bearer",
  "azp": "api-passerelle-test",
  "auth_time": 0,
  "session_state": "63ec8b62-e616-4185-b23d-86b57da901e9",
  "acr": "1",
  "realm_access": {
    "roles": [
      "offline_access",
      "admin",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  },
  "scope": "email profile",
  "email_verified": true,
  "preferred_username": "ineat-admin",
  "email": "ineatadmin@nimportequoi.fr"
}

В журналах ошибок сервера keycloak:

app_sso_test_1  | 11:25:36,277 WARN  [org.keycloak.events] (default task-178) type=PERMISSION_TOKEN_ERROR, realmId=realm-test, clientId=api-passerelle-test, userId=null, ipAddress=172.22.0.1, error=invalid_client_credentials, auth_method=oauth_credentials, grant_type=urn:ietf:params:oauth:grant-type:uma-ticket

некоторые части этого журнала заставляют меня задуматься:

  • userId = null (Почему? В jwt присутствует поле "sub".)
  • error = invalid_client_credentials (если userId = null, вот почему он отображает ошибку)

В консоли администратора keycloak я проверил с опцией "Evaluate" (Клиент> clientName> вкладка Authorization> вкладка Evaluate. Test OK! Отображается это:

ressource-manteau with scopes [view]
...

Policies
perm-view--ressource-manteau decision was PERMIT by UNANIMOUS decision. Granted Scopes: view.

    est-ineat-admin voted to PERMIT . 

и ссылка на «Показать данные авторизации» отображает это:

{
  "jti": "ee701252-4fb5-49f0-9a48-24285da70090",
  "exp": 1584542900,
  "nbf": 0,
  "iat": 1584542600,
  "aud": "api-passerelle-test",
  "sub": "7e6258d4-ffc8-4694-9ec3-0ba4f51967a9",
  "typ": "Bearer",
  "azp": "api-passerelle-test",
  "auth_time": 0,
  "session_state": "27ad1b5a-59d1-49c2-b2be-ff2952c46345",
  "acr": "1",
  "realm_access": {
    "roles": [
      "offline_access",
      "admin",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  },
  "authorization": {
    "permissions": [
      {
        "scopes": [
          "view"
        ],
        "rsid": "6e613882-2bbe-4f6e-a7ea-03f95f80236c",
        "rsname": "ressource-manteau"
      }
    ]
  },
  "scope": "email profile",
  "email_verified": true,
  "preferred_username": "ineat-admin",
  "email": "ineatadmin@toto.fr"
}

Мы видим часть авторизации. Однако у меня нет этой информации в маркере доступа.

Дон Не стесняйтесь задавать мне вопросы, если он запутался. Заранее спасибо. Я действительно хотел бы рассмотреть брелок как решение или мои будущие заявления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...