返回顶部
首页 > 资讯 > 后端开发 > Python >如何用Identity Server 4来保护 Python web api
  • 162
分享到

如何用Identity Server 4来保护 Python web api

2023-06-19 10:06:31 162人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关如何用Identity Server 4来保护 python WEB api,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。目前正在使用ASP.net core 2

这篇文章将为大家详细讲解有关如何用Identity Server 4来保护 python WEB api,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

目前正在使用ASP.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用Pythonpandas, 所以需要建立一个python 的 rest api, 我暂时选用了hug, 官网在这: Http://www.hug.rest/.

目前项目使用的是identity server 4, 还有一些web api和js client.

项目的早期后台源码https://GitHub.com/solenovex/asp.net-core-2.0-web-api-boilerplate

下面开始配置identity server 4, 我使用的是windows.

添加ApiResource:

在 authorization server项目中的配置文件添加红色部分, 这部分就是python hug 的 api:

public static IEnumerable<ApiResource> GetApiResources()

        {

            return new List<ApiResource>

            {

                new ApiResource(SalesApiSettings.ApiName, SalesApiSettings.ApiDisplayName) {

                    UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.PreferredUserName, JwtClaimTypes.Email }

                },

                new ApiResource("purchaseapi", "采购和原料库API") {

                    UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.PreferredUserName, JwtClaimTypes.Email }

                },

                new ApiResource("hugapi", "Hug API") {

                    UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.PreferredUserName, JwtClaimTypes.Email }

                }

            };

        }

修改js Client的配置:

               // Sales javascript Client

                new Client

                {

                    ClientId = SalesApiSettings.ClientId,

                    ClientName = SalesApiSettings.ClientName,

                    AllowedGrantTypes = GrantTypes.Implicit,

                    AllowAccessTokensViaBrowser = true,

                    AccessTokenLifetime = 60 * 10,

                    AllowOfflineAccess = true,

                    RedirectUris =           { $"{Startup.Configuration["MLH:SalesApi:ClientBase"]}/login-callback", $"{Startup.Configuration["MLH:SalesApi:ClientBase"]}/silent-renew.html" },

                    PostLoGoutRedirectUris = { Startup.Configuration["MLH:SalesApi:ClientBase"] },

                    AllowedCorsOrigins =     { Startup.Configuration["MLH:SalesApi:ClientBase"] },

                    AlwaysIncludeUserClaimsInIdToken = true,

                    AllowedScopes =

                    {

                        IdentityServerConstants.StandardScopes.OpenId,

                        IdentityServerConstants.StandardScopes.Profile,

                        IdentityServerConstants.StandardScopes.Email,

                        SalesApiSettings.ApiName,

                        "hugapi"

                    }

                }

修改js客户端的oidc client配置选项:

添加 hugapi, 与authorization server配置对应.

{

        authority: 'http://localhost:5000',

        client_id: 'sales',

        redirect_uri: 'http://localhost:4200/login-callback',

        response_type: 'id_token token',

        scope: 'openid profile salesapi hugapi email',

        post_logout_redirect_uri: 'http://localhost:4200',

        silent_redirect_uri: 'http://localhost:4200/silent-renew.html',

        automaticSilentRenew: true,

        accessTokenExpiringNotificationTime: 4,

        // silentRequestTimeout:10000,

        userStore: new WebStorageStateStore({ store: window.localStorage })

    }

建立Python Hug api

(可选) 安装virtualenv:

pip install virtualenv

然后在某个地方建立一个目录:

mkdir hugapi && cd hugapi

建立虚拟环境:

virtualenv venv

激活虚拟环境:

venv\Scripts\activate

然后大约这样显示:

如何用Identity Server 4来保护 Python web api

安装hug:

pip install hug

这时, 参考一下hug的文档. 然后建立一个简单的api. 建立文件main.py:

import hug@hug.get('/home')def root():    return 'Welcome home!'

运行:

hug -f main.py

结果好用:

如何用Identity Server 4来保护 Python web api

然后还需要安装这些:

pip install cryptography pyjwt hug_middleware_cors

其中pyjwt是一个可以encode和decode JWT的库, 如果使用RS256算法的话, 还需要安装cryptography. 

而hug_middleware_cors是hug的一个跨域访问中间件(因为js客户端和这个api不是在同一个域名下).

添加需要的引用:

import hug

import jwt

import JSON

import urllib.request

from jwt.algorithms import get_default_algorithms

from hug_middleware_cors import CORSMiddleware

然后正确的做法是通过Authorization Server的discovery endpoint来找到jwks_uri,

identity server 4 的discovery endpoint的地址是:

http://localhost:5000/.well-known/openid-configuration, 里面能找到各种节点和信息:

如何用Identity Server 4来保护 Python web api

但我还是直接写死这个jwks_uri吧:

response = urllib.request.urlopen('http://localhost:5000/.well-known/openid-configuration/jwks')still_json = json.dumps(json.loads(response.read())['keys'][0])

identity server 4的jwks_uri, 里面是public key, 它的结构是这样的:

如何用Identity Server 4来保护 Python web api

而我使用jwt库, 的参数只能传入一个证书的json, 也可就是keys[0].

所以上面的最后一行代码显得有点.......

如果使用python-jose这个库会更简单一些, 但是在我windows电脑上总是安装失败, 所以还是凑合用pyjwt吧.

然后让hug api使用cors中间件:

api = hug.API(__name__)api.http.add_middleware(CORSMiddleware(api))

然后是hug的authentication部分:

def token_verify(token):

    token = token.replace('Bearer ', '')

    rsa = get_default_algorithms()['RS256']

    cert = rsa.from_jwk(still_json)

    try:

        result = jwt.decode(token, cert, algorithms=['RS256'], audience='hugapi')

        print(result)

        return result

    except jwt.DecodeError:

        return False

token_key_authentication = hug.authentication.token(token_verify)

通过rsa.from_jwk(json) 就会得到key (certificate), 然后通过jwt.decode方法可以把token进行验证并decode, 算法是RS256, 这个方法要求如果token里面包含了aud, 那么方法就需要要指定audience, 也就是hugapi.

最后修改api 方法, 加上验证:

@hug.get('/home', requires=token_key_authentication)def root():    return 'Welcome home!'

最后运行 hug api:

hug -f main.py

端口应该是8000.

运行js客户端,登陆, 并调用这个hug api http://localhost:8000/home:

(我的js客户端是angular5的, 这个没法开源, 公司财产, 不过配置oidc-client还是很简单的, 使用)

如何用Identity Server 4来保护 Python web api

返回200, 内容是: 

如何用Identity Server 4来保护 Python web api

看一下hug的log:

如何用Identity Server 4来保护 Python web api

token被正确验证并解析了. 所以可以进入root方法了.

其他的python api框架, 都是同样的道理.

可以使用这个例子自行搭建 https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/7_JavaScriptClient 

关于如何用Identity Server 4来保护 Python web api就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何用Identity Server 4来保护 Python web api

本文链接: https://lsjlt.com/news/295482.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用Identity Server 4来保护 Python web api
    这篇文章将为大家详细讲解有关如何用Identity Server 4来保护 Python web api,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。目前正在使用asp.net core 2...
    99+
    2023-06-19
  • 如何利用jwt来保护你的接口服务
    目录前言一、JWT是什么HeadersPlayloadSignature二、JWT生成和解析token三、token续签问题总结前言 以前写过一篇关于接口服务规范的文章,原文在此,里...
    99+
    2024-04-02
  • 如何保护C++ Web应用程序免受安全威胁?
    如何保护 c++++ web 应用程序免受安全威胁?使用安全的编码技术:验证用户输入、编码数据。正确配置服务器:启用防火墙、更新软件、审核配置。采用安全框架:例如 boost.asio ...
    99+
    2024-05-12
    安全 c++
  • 如何使用命令行来保护你的Linux服务器
    保护Linux服务器的命令行操作可以包括以下几个方面:1. 使用强密码:确保服务器上的所有用户账户都使用强密码,密码包含至少8个字符...
    99+
    2023-10-18
    Linux
  • 如何利用 Python Spring 开发技术记录日志来保护你的应用程序?
    随着信息技术的不断发展,软件开发越来越依赖于技术的高效性和可靠性。然而,任何软件都存在一定的漏洞和错误,这些错误可能导致应用程序的崩溃,数据丢失或安全漏洞。因此,记录应用程序的日志是非常重要的,因为它可以帮助开发人员监视应用程序的运行情况并...
    99+
    2023-07-05
    spring 开发技术 日志
  • 如何使用 Python API 来优化您的 NPM 包?
    Python 是一种流行的编程语言,可用于优化 NPM 包。Python 有许多强大的 API,可以帮助您编写高效的代码和算法。在本文中,我们将探讨如何使用 Python API 来优化您的 NPM 包。 一、安装和配置 Python 在开...
    99+
    2023-06-26
    api unix npm
  • 如何使用Linux服务器保护Web接口免受恶意请求
    要保护Web接口免受恶意请求,可以采取以下几个步骤:1. 配置防火墙:配置防火墙以限制对Web接口的访问。只允许特定的IP地址或IP...
    99+
    2023-10-18
    Linux
  • 如何在Linux服务器上启用SSL加密以保护Web接口
    要在Linux服务器上启用SSL加密以保护Web接口,您可以按照以下步骤操作:1. 获取SSL证书:- 您可以从权威的SSL证书颁发...
    99+
    2023-10-18
    Linux
  • 如何在PHP开发中使用Git API来保证代码质量?
    在PHP开发中,使用Git API可以帮助我们更好地管理代码,确保代码质量。Git是一个非常流行的版本控制系统,它可以帮助我们跟踪代码的变化,回滚代码,协作开发等。在本文中,我们将介绍如何在PHP开发中使用Git API来保证代码质量。 一...
    99+
    2023-08-14
    开发技术 git api
  • 如何在 Python 中使用 numpy 来处理 API 数据?
    Python 是一种流行的编程语言,广泛用于数据科学、机器学习等领域。而 numpy 是 Python 中处理数值数据的核心库之一,它提供了高效的数组操作和数学函数,使得处理大规模数据变得更加容易。在本文中,我们将介绍如何使用 numpy...
    99+
    2023-09-26
    numy api leetcode
  • 如何在 Python 中使用 API 来 load 数据类型?
    Python 是一种高级编程语言,它提供了许多强大的 API 用于数据处理和分析。在数据分析的过程中,我们常常需要从各种渠道中收集数据,如从 Web API 或文件中读取数据。在本文中,我们将介绍如何使用 Python 中的 API 来 l...
    99+
    2023-07-22
    load 数据类型 api
  • 什么是API?如何在PHP中使用它来构建Web应用程序?
    API,全称应用程序编程接口(Application Programming Interface),是一种用于不同应用程序之间通信的方式。通过API,应用程序可以相互之间共享数据和功能,从而实现更高效、更灵活的开发和应用。在Web应用程序开...
    99+
    2023-06-06
    api shell numpy
  • PHP学习笔记:如何使用Spring API来提升Web开发能力?
    在现代Web开发中,Spring API已经成为了非常流行的框架之一。它是一个Java平台的应用程序框架,可以用于构建各种类型的Web应用程序。但是,很多PHP开发人员可能并不知道Spring API可以用于PHP的Web开发。 在本文中...
    99+
    2023-09-10
    学习笔记 spring api
  • 保姆级!如何在Window Server服务器上用tomcat部署java web项目
    首先,打开idae软件(我项目用的idea,也可以其他)导入你的项目,然后运行项目,确保项目能在localhost:8080,即在本地上运行。 确保能在本地上运行,且项目所有的已实现的功能没有bug,多测试几次。 然后打包项目,在打包前,...
    99+
    2023-09-18
    服务器 运维
  • 如何利用DOS命令来对抗U盘病毒保护U盘数据
    这篇文章主要讲解了“如何利用DOS命令来对抗U盘病毒保护U盘数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用DOS命令来对抗U盘病毒保护U盘数据”吧!U盘的便捷性与大容量的存储性,...
    99+
    2023-06-08
  • 如何使用Python API和Shell来实时监控数据?
    随着数字化时代的到来,数据监控变得越来越重要。无论是企业还是个人用户,都需要通过实时监控数据来保障数据的安全,提高数据的利用效率。在本篇文章中,我们将介绍如何使用Python API和Shell来实时监控数据。 Python API是Pyt...
    99+
    2023-07-31
    api shell 实时
  • 如何使用Linux服务器保护Web接口免受会话劫持攻击
    要保护Linux服务器上的Web接口免受会话劫持攻击,可以采取以下措施:1. 使用HTTPS:使用HTTPS协议对Web接口进行加密...
    99+
    2023-10-18
    Linux
  • 如何在IDE中使用Python和npm来开发Web应用?
    在当今互联网时代,Web开发已成为一项非常重要的技能。而Python和npm是两个非常强大的工具,被广泛用于Web应用程序的开发。在本文中,我们将探讨如何在IDE中使用Python和npm来开发Web应用。 一、Python和npm的介绍 ...
    99+
    2023-10-21
    npm path ide
  • 如何配置CentOS系统以保护Web应用程序免受SQL注入攻击
    要配置CentOS系统以保护Web应用程序免受SQL注入攻击,可以采取以下步骤:1. 更新系统:确保系统和软件都是最新版本,以获得最...
    99+
    2023-10-12
    CentOS
  • 如何在 Python 中使用 API 来 load 各种数据类型?
    Python 是一种高级编程语言,被广泛应用于数据科学、机器学习、人工智能等领域。在这些领域中,我们通常需要使用各种数据类型来进行分析和建模。这些数据类型可能来自于不同的来源,例如数据库、文件、网络等。为了方便地处理这些数据,我们可以使用 ...
    99+
    2023-07-21
    load 数据类型 api
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作