首页 文章 精选 留言 我的

精选列表

搜索[未成年人保护],共10000篇文章
优秀的个人博客,低调大师

用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api

[新添加] 本文对应的源码 (多个flow, clients, 调用python api):https://github.com/solenovex/Identity-Server-4-Python-Hug-Api-Jwks 目前正在使用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. 添加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 然后大约这样显示: 安装hug: pip install hug 这时, 参考一下hug的文档. 然后建立一个简单的api. 建立文件main.py: import hug @hug.get('/home') def root(): return 'Welcome home!' 运行: hug -f main.py 结果好用: 然后还需要安装这些: 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, 里面能找到各种节点和信息: 但我还是直接写死这个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, 它的结构是这样的: 而我使用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还是很简单的, 使用) 返回200, 内容是: 看一下hug的log: token被正确验证并解析了. 所以可以进入root方法了. 其他的python api框架, 都是同样的道理. [新添加]本文对应的源码 (多个flow, clients, 调用python api):https://github.com/solenovex/Identity-Server-4-Python-Hug-Api-Jwks 可以使用这个例子自行搭建 https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/7_JavaScriptClient 官方还有一个nodejs api的例子:https://github.com/lyphtec/idsvr4-node-jwks 今日修改后的代码: import json import hug import jwt import requests from jwt.algorithms import get_default_algorithms from hug_middleware_cors import CORSMiddleware api = hug.API(__name__) api.http.add_middleware(CORSMiddleware(api)) def token_verify(token): access_token = token.replace('Bearer ', '') token_header = jwt.get_unverified_header(access_token) res = requests.get( 'http://localhost:5000/.well-known/openid-configuration') jwk_uri = res.json()['jwks_uri'] res = requests.get(jwk_uri) jwk_keys = res.json() rsa = get_default_algorithms()['RS256'] key = json.dumps(jwk_keys['keys'][0]) public_key = rsa.from_jwk(key) try: result = jwt.decode(access_token, public_key, algorithms=[ token_header['alg']], audience='api1') return result except jwt.DecodeError: return False token_key_authentication = hug.authentication.token(token_verify) @hug.get('/identity', requires=token_key_authentication) def root(user: hug.directives.user): print(user) return user 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan下面是我的关于ASP.NET Core Web API相关技术的公众号--草根专栏:

优秀的个人博客,低调大师

【聚能聊】网络安全事件频发,怎么保护自己的生物识别信息

聚能聊有奖话题:https://yq.aliyun.com/roundtable/59358?spm=5176.8091938.0.0.ZCJ5o4 随着科技的进步,越来越多的生物识别技术被应用到生活和工作中。像最常见的指纹识别和人脸识别,还有三星S8的虹膜识别,以及部分语音应用的声纹识别。当然,在公安系统还有步态特征识别等等。这些生物识别技术确实为人们提供了巨大的便利,但是他们真的足够安全吗? 上周有幸参加了一个互联网+的网络安全研修班,从公安部门网安总队的总工程师到阿里安全应急响应的负责人贤唐,都有来讲课、演示。上完全部课程后,才真正意识到现在的网络安全问题有多严重。课上的内容非常敏感,所以都是禁止拍照的。从这一点也可以看出,我们现在所谓的安全,基本上都是处在一个自欺欺人的状态。 比较著名的,有近期广为人知的系统漏洞引起的勒索病毒敲诈案,和软件系统漏洞导致个人信息泄露而引发精准犯罪的徐玉玉案以及其他众多更加严重的案件。现在的大多系统都非常脆弱。如果被利用,基本上后果都不堪设想,大家也是挺震惊的。 对于个人呢?基本上,大家的各种信息,像姓名、手机号码、身份证号码以及现在新兴的各种生物识别信息,也都处在裸奔状态。黑市上,这种信息一直在倒卖。比如你的银行卡信息,犯罪份子买过去后,只需要几分钟时间,就能做出一张能够正常使用的银行卡。不同的是,密码可以修改,手机号码可以换,银行卡也能注销,但生物识别信息具有唯一性和不可更改性,会跟随你一辈子。一旦这些信息泄露…… PS:欢迎在底部评论区进行讨论。点赞最多的前两位,特别送出小礼品哟。技术书籍、阿里云代金券等,随你挑~

优秀的个人博客,低调大师

事件还原 | 苹果iOS 10系统“激活锁”绕过漏洞,丢失保护功能形同虚设?

想必读者们已经在雷锋网 (公众号:雷锋网) (公众号:雷锋网)看到了关于iOS 10.1.1 系统“激活锁”被绕过漏洞的报道(见于雷锋网昨日报道:《 iOS 10.1发现新漏洞:可绕过“激活锁”强行进入主屏》 ) 本着求真和好奇的心态,此次宅客频道将带领读者们讲述此次事件的来龙去脉、破解流程以及相关细节,试图将完整的故事呈现给读者们,让读者了解到: 漏洞是什么,可导致何种后果? 这个漏洞最早是如何被发现的? 复现漏洞的具体步骤是怎样的? 我们是否会受影响,该怎么做? 该漏洞有何后果? 从iOS 7开始,苹果设备就具有一项“激活锁”功能, 当用户的设备不慎被偷,只要激活"丢失模式”(Lost mode),盗窃者在没有得到合法机主许可就无法激活设备到正常工作状态,这使得丢失的苹果设备很难被直接转卖,不仅提高安全性还降低了失窃率。 这也是许多人在丢失苹果

优秀的个人博客,低调大师

少个人保护?我来!——阿里云在ICANN第3届GDD峰会纪实

西班牙马德里以足球和斗牛闻名于世,2017年5月9日至11日,ICANN第三届全球域名部门行业峰会(GDD)在这里召开。阿里云作为亚洲域名保有量最高的注册商,代表成千上万客户的利益与权力,派出代表,前往马德里,全程参与了本次会议,我们可以骄傲地说:我们为中国域名站台!我们为你(中国域名用户)带盐!让我成为你的斗牛士! ICANN 亚太地区注册商服务资深经理李光皓Howard Li(左一)、ICANN注册商服务总监Jennifer Gore(右一)与阿里云域名业务总监王鹏Charles Wang(左二)、域名业务合规总监Pam Little (左三)会面,深入沟通各自观点。 Topic zero “域名世界的联合国” ICANN——一个熟悉又陌生的“神秘组织”,无论你是新入域名界菜鸟还是身经百战的老司机,一定听说过这个组织,却感觉它与我们太远,没啥关系。你。错。了。打个比方,ICANN就是域名与IP星球的联合国,你可能感受不到他的存在,但是他却是无时无刻不在看着你、管着你、影响着你。如果将ICANN比喻成联合国,那么这个大会就是域名世界的“联合国大会”啦~本次“联合国大会”议程紧密,有条不紊,探讨话题从后台技术、资质认证、服务协议、流程改进到新兴市场、行业前景、世界和平等,层出不穷。这届大会,呜呜嚷嚷有400多人参会,创下参会人数新高。短短几天议程,能和“联合国参议院”打个照面都不容易,更别提面对面的发言机会了。然而阿里云代表团,代表中国域名用户的利益,一言不合就发言,一言不合就发问,就许多与我们息息相关的话题展开讨论。 马德里大会讨论盛况 Topic one“代表中国域名用户争取更多权益” ICANN的运营机制也和“联合国”很像,他是非营利组织,很多决定都由“参与国”讨论、提出议题、投票选出结论。而每一个决定,可以说都和我们每位用户息息相关。阿里云虽然于今年初成为了ICANN Registrar Stakeholder Group (RrSG)注册商相关方社群团体的会员。这意味着:我们能够代表千万用户表达观点但在目前该组织的章程和限制下,阿里云还没有获得投票权,也没有资格担任执行委员会、提名委员或GNSO(Generic Names Supporting Organization)成员,或获得任何其他选举产生的席位或职位。这意味着:我们还没有帮助我们的用户获得足够的话语权。 我们认为,这里的某些章程与限制存在着:原因不明,规定模糊,很多内容甚至已经不符合当前的域名市场现状。会导致对于中国广大域名用户的不公平和不公正。 我们对此深切关注。 We are deeply concerned. 与会期间,我们向 ICANN 各个重要职位成员表达了我们的观点和愿望。 阿里云,做为亚洲最大注册商,将在 影响修改改进RrSG章程促进不同语言建立公平竞争环境促进ICANN全球化, 以建立公平竞争环境 等方向上持续努力。 Topic two“隔壁老王不上税?为啥我的用户要上税” ICANN源自加州,对于美国机构和非美国机构,有着不一样的“眼镜”。这个差别实际体现在一个叫做WithholdingTax(预扣税)的税费上面。 我们举个炭火烤栗子: 一家坐落美国的老王,要花100美金买个IP,则他只需要过个马路去支付这100美金就好; 而一家坐标土库曼斯坦的尼古拉斯买买提司机三世,则需要先付10元给到土库曼斯坦的税务部门(假如Withholding tax税率为10%),而后仍然要汇款100美金来买同样一个IP; 这表示尼古拉斯同志购买相同的东西,却花了110美金! 如果这个税率是20%呢?尼古拉斯每100美金就要比美国老王多花20美金; 如果这个税率是30%呢?尼古拉斯每100美金就要比美国老王多花30美金; 这!不!公!平! 阿里云在会议上直接指出这个问题: 做一样的生意,卖一样的产品,为啥老王不交税我的客户要交? 而且这些本不必要的成本最终被不是美国的用户们最终承担了。 买一样的东西,为啥老王便宜,我的客户买的贵? 并且提出了可能的解决方案。 1、ICANN可以在将当地机构作为收款单位,提供与美国老王同等的待遇; 2、或者ICANN自行吸收这部分税费的负担,以保证市场的公平; 为域名世界的公平公正做出一点点贡献,我骄傲! Topic three“我们中国用户需要,中文条款” ICANN源自美国,继承了山姆大叔的血继界限,基本只说英语。要知道“联合国条款”有多繁文缛节,有多堆积如山。我们的用户,绝大多数是使用汉语言的, 无法第一时间获取准确的新信息,这种“时间误差”和“理解偏差”,很容易对用户形成巨大风险。用户不知不觉可能就违规了,可能就被新规定束缚了。这!不!公!平! 阿里云将这个问题在本次会议上直抒胸臆:“凭啥不说中文!”(现场表达稍有改动) 只有说了中文,我们的用户才能更好的参与其中,得到更优质的服务!只有说了中文,才对得起每个使用汉语的域名用户!只有说了中文,才对得起50%的新顶级域用户!只有说了中文,才称得上公平公开! 相信这个问题引起了ICANN的足够重视,相信以中文为主要语言的广大域名用户,将会因此受益! ICANN董事会董事Asha Hemrajani(左三)与阿里云代表会面 我们必将不断努力,争取代表成千上万的中国域名客户在ICANN社群发出更大的声音以及获得更大的影响力,从而回馈广大用户对于阿里云的支持与信任! 如果您对ICANN有着疑问或意见建议,也欢迎在此留言。 我们将悉心为您解答,同时 进行认真地梳理与汇总,尽早帮您解决更多的实际问题。 争取更多利益。 咱们, 一起加油!!!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册