Если я правильно понимаю, чтобы авторизовать запрос или мутацию в hasura с использованием JWT, есть несколько требований, которые должны быть выполнены в самом запросе, а именно:
- Сам JWT, представлен в заголовке запроса
Authorization: Bearer <token here>
- x-hasura-role, представлен в заголовке запроса (необязательно)
x-hasura-role: user
- Фактический запрос или мутация, представленная в теле запроса
myQuery {
id
name
another_field
}
Когда запрос затем отправляется на конечную точку hasura, механизм hasQL GraphQL попытается
- Проверить JWT
- Проверьте, существует ли значение
x-hasura-role
, установленное в заголовке запроса, внутри x-hasura-allowed-role
утверждений jwt - Если все условия выполнены, то механизм GraphQL проверит, выполняет ли роль, присваивается из значения
x-hasura-role
заголовок имеет разрешение на выполнение запроса из тела запроса
Насколько я понимаю, это означает, что кто-то может «подделать» запрос к хасуре Гра Механизм phQL, установив значение x-hasura-role
на что-то еще, что существует внутри утверждения x-hasura-allowed-roles
JWT. Например, если утверждение x-hasura-allowed-roles
выглядит примерно так
{
...
'x-hasura-allowed-roles': ['role1','role2'],
'x-hasura-default-role': 'role1',
'x-hasura-user-id': username
}
}
, то это означает, что тот, кто предположительно назначен только для role1, может выполнить запрос, который ограничен для role2, только установив x-hasura-role
заголовок в запросе на x-hasura-role: role2
Правильно ли мое понимание? Если это так, как лучше всего избежать этой ситуации, поскольку она выглядит как уязвимость безопасности? Должен ли я ограничить требование x-hasura-allowed-roles
jwt ТОЛЬКО ролью, назначенной каждому пользователю на основе моей службы аутентификации?