我希望使用Flask保护Web API并与之集成flask-admin以提供管理界面.我搜索并发现flask-admin有一个管理面板,/admin默认情况下任何人都可以访问它.它不提供身份验证系统并且完全打开(没有任何安全性),因为他们没有假设用于提供安全性的内容.此API必须在生产中使用,因此我们无法/admin为每个人访问网址提供开放路径.需要适当的身份验证.
在views.py我不能简单地放置/admin路由并通过装饰器提供身份验证,因为这将覆盖已经创建的现有路由flask-admin,从而导致错误.
进一步的研究表明,有两个模块flask-admin和flask-security.我知道flask-admin有is_accessible保护它的方法,但它没有提供很多功能flask-security.
我没有找到任何方法来确保终点/admin加上所有其他终点,/admin例如/admin/<something>.
我正在寻找专门用flask-security来完成这项任务.如果不可能,请提出替代方案.
PS:我知道我可以锁定ngnix自己,但那将是最后一个选择.如果我可以拥有一个认证系统,flask-security那将是好事.
我正在构建基于Flask的REST API并使用Flask-JWT来处理JWT身份验证.我还想使用Flask-Security的内置角色管理.但是,Flask-Security的@roles_required()装饰器假设我在失败时显示Flask视图.
这是我的令牌端点(它正在按我的意愿工作):
$ 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"
}
Run Code Online (Sandbox Code Playgroud)
以下是对没有任何角色要求的资源的成功响应(仅使用@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]>
Run Code Online (Sandbox Code Playgroud)
当我对具有所需角色的资源(例如本例中的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: …Run Code Online (Sandbox Code Playgroud) 有人使用Flask-Security扩展进行身份验证吗?如何使注册视图起作用?
http://packages.python.org/Flask-Security/customizing.html
我指的是上面的链接.
@app.route('/register', methods=['GET'])
def register():
return render_template('security/register_user.html')
Run Code Online (Sandbox Code Playgroud)
我不想扩展默认类,我只想在我的站点布局中包装默认注册视图,所以我这样做了.
{% extends "layout.html" %}
{% block title %}upload{% endblock %}
{% block body %}
{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% include "security/_messages.html" %}
<h1>Register</h1>
<form action="{{ url_for_security('register') }}" method="POST" name="register_user_form">
{{ register_user_form.hidden_tag() }}
{{ render_field_with_errors(register_user_form.email) }}
{{ render_field_with_errors(register_user_form.password) }}
{% if register_user_form.password_confirm %}
{{ render_field_with_errors(register_user_form.password_confirm) }}
{% endif %}
{{ render_field(register_user_form.submit) }}
</form>
{% include "security/_menu.html" %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误?
werkzeug.routing.BuildError
BuildError: ('security.register', {}, None)
Run Code Online (Sandbox Code Playgroud) 我正在开发Flask应用程序并使用Flask-security进行用户身份验证(后面又使用Flask-login).
我有一条需要认证的路线/user.我正在尝试编写一个单元测试来测试,对于经过身份验证的用户,这会返回相应的响应.
在我的unittest中,我正在创建一个用户并以该用户身份登录:
from unittest import TestCase
from app import app, db
from models import User
from flask_security.utils import login_user
class UserTest(TestCase):
def setUp(self):
self.app = app
self.client = self.app.test_client()
self._ctx = self.app.test_request_context()
self._ctx.push()
db.create_all()
def tearDown(self):
if self._ctx is not None:
self._ctx.pop()
db.session.remove()
db.drop_all()
def test_user_authentication():
# (the test case is within a test request context)
user = User(active=True)
db.session.add(user)
db.session.commit()
login_user(user)
# current_user here is the user
print(current_user)
# current_user within this request is an anonymous …Run Code Online (Sandbox Code Playgroud) 我目前正在寻找一种使用基于令牌的身份验证来保护REST API的方法.我正在使用Flask在Python中开发API,并发现了flask-security扩展,它似乎有很多有趣的功能.
令牌中提到的功能之一是令牌认证.
根据文件:
通过执行HTTP POST检索用户身份验证令牌来启用基于令牌的身份验证,其中身份验证详细信息为针对身份验证端点的JSON数据.成功调用此端点将返回用户的ID及其身份验证令牌.此令牌可用于对受保护资源的后续请求.
但是,我仍然对如何使用flask-security实现此功能感到困惑.一些在线研究让我使用了诸如@auth_token_required之类的东西,但我把所有东西放在一起都有些麻烦.烧瓶安全文档本身并不是很有帮助.
例如,用户如何获得身份验证令牌?什么是身份验证端点?
如果你能引导我朝着正确的方向前进,那就太棒了.代码示例也很棒:-)
我正在用烧瓶进行Web开发.我想在前端构建一个带有烧瓶的webapp作为后端和angular.js.Json部分是直截了当的,我的第一步很好.但现在我陷入了用户身份验证.我读了很多,但发现WTFForms的工作效果不如角度(没有CSFR令牌),所以我不能使用像flask-security这样的东西.
使用Angular和Flask实现用户身份验证的正确方法或最佳实践是什么?(也许有人知道一个很好的示例应用程序,我可以通过示例学习)
我正在尝试使用user_registered信号,以便在用户使用flask-security注册时为用户设置默认角色,如以下链接所示:在Flask Security中设置默认角色
在我的搜索中,我可以看到在烧瓶安全性中已经解决了这个问题:没有从烧瓶安全性,Fix - user_registered信号问题获得信号
我已尝试以下方法来证明处理程序是否收到信号而没有任何运气:
@user_registered.connect_via(app)
def user_registered_sighandler(sender, **extra):
print("print-user_registered_sighandler:", extra)
Run Code Online (Sandbox Code Playgroud)
然而,即使用户注册并且应该发送信号,也不会被调用.
如果它有助于我设置flask-security配置如下:
app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_CONFIRMABLE'] = False
app.config['SECURITY_SEND_REGISTER_EMAIL'] = False
app.config['SECURITY_CHANGEABLE'] = True
app.config['SECURITY_SEND_PASSWORD_CHANGE_EMAIL'] = False
Run Code Online (Sandbox Code Playgroud)
来自Flask-Login和Flask-Principal的信号正在为我工作,因为我设法确认以下代码片段在发送信号时成功打印:
@user_logged_out.connect_via(app)
def on_user_logged_out(sender, user):
print('USER LOG OUT: made it in',user)
@identity_changed.connect_via(app)
def identity_changed_ok(sender,identity):
print('Identity changed:',identity)
Run Code Online (Sandbox Code Playgroud)
对于我的设置,我使用python 3.3(anaconda)并使用以下内容:Flask == 0.10.1,flask-login == 0.2.11,flask-principal == 0.4.0,flask-security == 1.7.4,信号灯== 1.3.看了瓶子登录和烧瓶安全的信号,我不知道为什么烧瓶安全信号不起作用.
编辑:
如果我print(user_registered.receivers)在我的应用程序中添加路线,它将显示我有一个接收器:{139923381372400: <function user_registered_sighandler at 0x7f42737145f0>}.如果我把这个相同的print语句放在flask-security的registerable.py之前,user_registered.send(app._get_current_object(),user=user, confirm_token=token)那么它就没有列出接收器:{}
EDIT2:
问题似乎与使用python 3.3有关.我创建了一个python 2.7环境,user_registered代码按预期工作.
完整代码重现:
from …Run Code Online (Sandbox Code Playgroud) 我有一个烧瓶应用程序作为REST API后端.我想为后端实现基于令牌的身份验证,但为了做到这一点,我需要检索用户令牌.Flask-Security文档明确指出,要检索令牌,需要执行HTTP POST,并将身份验证详细信息作为JSON数据发送到身份验证端点.不幸的是,我不明白如何检索执行此类请求所需的CSRF令牌.
如果我使用扩展提供的登录页面/模板,CSRF令牌将在窗体的隐藏字段中传递给客户端.问题是:
如何在不访问和解析登录页面的情况下检索CSRF令牌,例如使用$ http方法或移动应用程序的angularJS应用程序?
显然我可以避免使用Flask-Security并自己实现这些部分,但我对webapps相对缺乏经验,我觉得我可能会以错误的方式接近它.
我正在尝试允许用户使用来自单独Web服务的帐户登录我的Flask应用程序.我可以联系此Web服务的api并获得安全令牌.如何使用此令牌对用户进行身份验证,以便他们可以访问受限制的视图?
我不需要将用户保存到我自己的数据库中.我只想为会话验证它们.我相信这可以使用Flask-Security和@auth_token_required装饰器完成,但文档不是很详细,我不知道如何实现它.
编辑:
这是一个代码示例:
@main.route("/login", methods=["GET", "POST"])
def login():
payload = {"User": "john", "Password": "password123"}
url = "http://webserviceexample/api/login"
headers = {'content-type': 'application/json'})
#login to web service
r = requests.post(url, headers=headers, json=payload)
response = r.json()
if (r.status_code is 200):
token = response['user']['authentication_token']
# allow user into protected view
return render_template("login.html", form=form)
@main.route('/protected')
@auth_token_required
def protected():
return render_template('protected.html')
Run Code Online (Sandbox Code Playgroud) python authentication flask flask-security http-token-authentication
我的目标是为我的Web应用程序提供REST API.使用:
我需要保护对Web和REST访问的数据的访问.但是,request在尝试连接到安全API时,我无法获得任何常规python 成功.
使用本问题末尾提供的全功能模块获得以下输出.
我设法在使用时得到正确的答案http://127.0.0.1:5000/api/v1/free_stuff:
>>> import requests
>>> r=requests.get('http://127.0.0.1:5000/api/v1/free_stuff')
>>> print 'status:', r.status_code
status: 200 # all is fine
Run Code Online (Sandbox Code Playgroud)
尝试使用身份验证时http://127.0.0.1:5000/api/v1/protected_stuff:
>>> from requests.auth import HTTPBasicAuth, HTTPDigestAuth
>>> r=requests.get('http://127.0.0.1:5000/api/v1/protected_stuff',
auth=HTTPBasicAuth('test', 'test')) # the same with ``HTTPDigestAuth``
>>> print 'status:', r.status_code
status: 401
>>> r.json() # failed!
{u'message': u'401: Unauthorized'}
Run Code Online (Sandbox Code Playgroud)
这是一个用于产生上述结果的虚拟功能模块:
from flask import Flask, render_template, url_for, redirect
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import Security, …Run Code Online (Sandbox Code Playgroud) python restful-authentication flask flask-security flask-restless
flask-security ×10
flask ×9
python ×6
angularjs ×2
blinker ×1
flask-admin ×1
flask-jwt ×1
flask-login ×1
python-3.x ×1
rest ×1
security ×1
unit-testing ×1