Я писал уже другие вопросы по переполнению стека об этой проблеме. И нет решения для его решения.
Я хочу защитить конечную точку с применением политики. Мой тест выполняется с помощью "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"
}
Мы видим часть авторизации. Однако у меня нет этой информации в маркере доступа.
Дон Не стесняйтесь задавать мне вопросы, если он запутался. Заранее спасибо. Я действительно хотел бы рассмотреть брелок как решение или мои будущие заявления.