Использование ролей Flask-Security с API-интерфейсом Flask-JWT REST
Я создаю API REST на основе Flask и использую Flask-JWT для обработки JWT auth. Я также хочу использовать встроенное управление ролями с помощью Flask-Security. Тем не менее, Flask-Security @roles_required() decorator предполагает, что я показываю вид флага, когда он терпит неудачу.
Вот моя конечная точка маркера (которая работает так, как я хочу):
$ http POST localhost:5000/auth/token username='test' password='test'
HTTP/1.0 200 OK
Content-Length: 192
Content-Type: application/json
Date: Sun, 08 Nov 2015 17:45:46 GMT
Server: Werkzeug/0.10.4 Python/3.5.0
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ"
}
Вот успешный ответ на ресурс, который не имеет никакого требования к роли (используя только @jwt_required). Это также работает так, как я хочу:
$http GET localhost:5000/protected Authorization:'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ'
HTTP/1.0 200 OK
Content-Length: 25
Content-Type: text/html; charset=utf-8
Date: Sun, 08 Nov 2015 17:46:24 GMT
Server: Werkzeug/0.10.4 Python/3.5.0
<models.User[email=test]>
Когда я делаю то же самое для ресурса с требуемыми ролями (например, admin в этом примере), кажется, что у меня есть страница для отображения, например /login, которой я не являюсь, поскольку это безгласный REST API:
$ http GET localhost:5000/admin Authorization:'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ'
HTTP/1.0 302 FOUND
Content-Length: 209
Content-Type: text/html; charset=utf-8
Date: Sun, 08 Nov 2015 17:46:43 GMT
Location: http://localhost:5000/
Server: Werkzeug/0.10.4 Python/3.5.0
Set-Cookie: session=eyJfZmxhc2hlcyI6W3siIHQiOlsiZXJyb3IiLCJZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgcmVzb3VyY2UuIl19XX0.CSEcAw.pjwXLeSWUsORXR-OU5AfFvq6ESg; HttpOnly; Path=/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/">/</a>. If not click the link.
Я знаю, что Flask-Security использует Flask-Principal за сценой для управления ролями (@roles_required и т.д.), и он связан с RoleMixin и UserMixin для хранилища данных, что очень приятно. Однако, если нет способа заставить Flask-Security просто разрешить ресурс без использования моего JWT-заголовка, то лучше всего создать собственные декодеры, которые используют Flask-Principal для управления ролями.
Есть ли у кого-нибудь опыт? Идея заключается в том, что весь внешний интерфейс может и будет строиться на любом языке, который нам нужен, а это означает, что это не могут быть флеш-шаблоны/представления, которые, по-видимому, делают Flask-Security.
Спасибо за любое понимание, которое любой может предоставить!