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


这篇文章将为大家详细讲解有关如何用Identity Server 4来保护 Python web api,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。目前正在使用asp.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用python的pandas, 所以需要建立一个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.在 authorization server项目中的配置文件添加红色部分, 这部分就是python hug 的 api:public static IEnumerable GetApiResources() { return new List { 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 } } }; } // 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” } }添加 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 }) }(可选) 安装virtualenv:然后在某个地方建立一个目录:建立虚拟环境:激活虚拟环境:然后大约这样显示:安装hug:这时, 参考一下hug的文档. 然后建立一个简单的api. 建立文件main.py:运行:结果好用:然后还需要安装这些:其中pyjwt是一个可以encode和decode JWT的库, 如果使用RS256算法的话, 还需要安装cryptography.而hug_middleware_cors是hug的一个跨域访问中间件(因为js客户端和这个api不是在同一个域名下).添加需要的引用:import hugimport jwtimport jsonimport urllib.requestfrom jwt.algorithms import get_default_algorithmsfrom hug_middleware_cors import CORSMiddleware然后正确的做法是通过Authorization Server的discovery endpoint来找到jwks_uri,identity server 4 的discovery endpoint的地址是:http://localhost:5000/.well-known/openid-configuration, 里面能找到各种节点和信息:但我还是直接写死这个jwks_uri吧:identity server 4的jwks_uri, 里面是public key, 它的结构是这样的:而我使用jwt库, 的参数只能传入一个证书的json, 也可就是keys[0].所以上面的最后一行代码显得有点…….如果使用python-jose这个库会更简单一些, 但是在我windows电脑上总是安装失败, 所以还是凑合用pyjwt吧.然后让hug api使用cors中间件:然后是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 Falsetoken_key_authentication = hug.authentication.token(token_verify)通过rsa.from_jwk(json) 就会得到key (certificate), 然后通过jwt.decode方法可以把token进行验证并decode, 算法是RS256, 这个方法要求如果token里面包含了aud, 那么方法就需要要指定audience, 也就是hugapi.最后修改api 方法, 加上验证:最后运行 hug api:端口应该是8000.运行js客户端,登陆, 并调用这个hug api http://localhost:8000/home:(我的js客户端是angular5的, 这个没法开源, 公司财产, 不过配置oidc-client还是很简单的, 使用)返回200, 内容是:看一下hug的log:token被正确验证并解析了. 所以可以进入root方法了.其他的python api框架, 都是同样的道理.可以使用这个例子自行搭建 https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/7_JavaScriptClient关于如何用Identity Server 4来保护 Python web api就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

相关推荐: Python中的==与is操作符有什么区别

这篇文章主要讲解了“Python中的==与is操作符有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的==与is操作符有什么区别”吧!我们先用双胞胎猫做一些类比。假设你有一对非常相似的双胞…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 10/05 22:11
下一篇 10/05 22:11

相关推荐