Python 3.x 基于Flask的API的身份验证?

Python 3.x 基于Flask的API的身份验证?,python-3.x,flask,google-authentication,Python 3.x,Flask,Google Authentication,我已经通过Flask视图构建了一个API,用户可以使用/API/v1/…上的一些端点访问它。我想对发出请求的用户进行身份验证。使用我的API强制执行身份验证的方法有哪些?有没有办法避免建立用户模型,而是使用基于Google或Github的身份验证?我使用flask login,它通过会话和头截获web请求。来自web的请求使用Flask的会话,来自移动应用程序的请求发送一个标题 这些方法返回给定请求的用户。API令牌由ITShazard签名(防篡改),为Flask的cookie提供动力 from

我已经通过Flask视图构建了一个API,用户可以使用
/API/v1/…
上的一些端点访问它。我想对发出请求的用户进行身份验证。使用我的API强制执行身份验证的方法有哪些?有没有办法避免建立用户模型,而是使用基于Google或Github的身份验证?

我使用flask login,它通过会话和头截获web请求。来自web的请求使用Flask的会话,来自移动应用程序的请求发送一个标题

这些方法返回给定请求的用户。API令牌由ITShazard签名(防篡改),为Flask的cookie提供动力

from itsdangerous import URLSafeSerializer, BadData
serializer = URLSafeSerializer(CONFIG['SECRET_KEY'])


def load_user_from_request(request):
    token = request.headers.get('API-TOKEN')
    if token:
        try:
            user_id = serializer.loads(token)["id"]
            user = User.query.filter(User.active == True, User.id == int(user_id)).first()
            if user:
                return user
        except BadData as e:
            pass
    return None


def load_user(id):
    user = User.query.filter(User.active == True, User.id == int(id)).first()
    if not user:
        return None
    return user

login_manager.user_loader(load_user)
login_manager.request_loader(load_user_from_request)
此端点接收身份验证请求,检查用户名和密码并发出令牌。它的序列化程序生成对象的防篡改版本。客户机提交的文件与标题相同。只要应用程序的密钥是安全的,您的服务器就可以确认已签名的对象是由您的服务器颁发的

@blueprint.route('/api_auth', methods=["post"])
def api_auth():
   ...check username and password
    return response({
        'API-TOKEN': serializer.dumps({'id': user.id})
    })

我使用flask登录,它拦截带有会话的web请求和带有头的web请求。来自web的请求使用Flask的会话,来自移动应用程序的请求发送一个标题

这些方法返回给定请求的用户。API令牌由ITShazard签名(防篡改),为Flask的cookie提供动力

from itsdangerous import URLSafeSerializer, BadData
serializer = URLSafeSerializer(CONFIG['SECRET_KEY'])


def load_user_from_request(request):
    token = request.headers.get('API-TOKEN')
    if token:
        try:
            user_id = serializer.loads(token)["id"]
            user = User.query.filter(User.active == True, User.id == int(user_id)).first()
            if user:
                return user
        except BadData as e:
            pass
    return None


def load_user(id):
    user = User.query.filter(User.active == True, User.id == int(id)).first()
    if not user:
        return None
    return user

login_manager.user_loader(load_user)
login_manager.request_loader(load_user_from_request)
此端点接收身份验证请求,检查用户名和密码并发出令牌。它的序列化程序生成对象的防篡改版本。客户机提交的文件与标题相同。只要应用程序的密钥是安全的,您的服务器就可以确认已签名的对象是由您的服务器颁发的

@blueprint.route('/api_auth', methods=["post"])
def api_auth():
   ...check username and password
    return response({
        'API-TOKEN': serializer.dumps({'id': user.id})
    })

谢谢看起来您使用的是本地用户模型--我想知道是否有人在使用第三方身份验证系统时实现了类似的功能。没有理由认为用户“模型”应该在某个数据库中。Flask登录可以使用API进行登录操作。谢谢!看起来您使用的是本地用户模型--我想知道是否有人在使用第三方身份验证系统时实现了类似的功能。没有理由认为用户“模型”应该在某个数据库中。Flask登录可以使用API来进行登录操作。我认为Flask OAuth或Flask OAuthLib会有帮助。我认为Flask OAuth或Flask OAuthLib会有帮助。