token

用rust写一个玩具解释器10(parser)

安稳与你 提交于 2020-03-01 19:45:54
介绍完中缀和前缀表达式 那么今天就把parser的代码全部贴出来 可跳过 use crate::ast::ast::ASTNode; use crate::ast::ast; use crate::mylexer::lexer; use crate::token::token; use std::collections::HashMap; pub enum Pri { LOWEST, ASSIGN , // 赋值 EQUALS , // ==, != LESSGREATER , // < ,> SUM , //+,- PRODUCT ,//*,/ PREFIX , // !,- CALL , // func() INDEX, // array[0], map[0] } macro_rules! get_pri { ($x:ident) => { Pri::$x as i8 }; } //这里嘛, 现在还没有更好的办法解决... fn get_precedence(t: token::TokenType) ->i8 { let map: HashMap<token::TokenType,i8> = { let mut mmap = HashMap::new(); mmap.insert(token::EQ, get_pri!(EQUALS)); mmap.insert(token:

oauth2.0理解与应用

筅森魡賤 提交于 2020-03-01 19:25:43
相关内容整理自阮一峰文档: 理解OAuth 2.0 《OAuth 2.0 教程》 OAuth 是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版,可参考: RFC 6749 。 OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。Oauth的核心就是向第三方应用颁发令牌(token)。 一、应用场景 为了理解OAuth的适用场合,让我举一个假设的例子。 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。 问题是只有得到用户的授权,Google才会同意"云冲印"读取这些照片。那么,"云冲印"怎样获得用户的授权呢? 传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。 (1)"云冲印"为了后续的服务,会保存用户的密码,这样很不安全。 (2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。 (3)"云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。 (4)用户只有修改密码,才能收回赋予"云冲印"的权力

php实现jwt

此生再无相见时 提交于 2020-03-01 19:07:16
一:JWT是什么 JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。基于token的身份验证可以替代传统的cookie+session身份验证方法。 JWT由三个部分组成:header.payload.signature 二:代码实现 class JWT { private static $header=array( 'alg'=>'SHA256', //生成signature的算法 'typ'=>'JWT' //类型 ); private static $payload= array( ); //使用HMAC生成信息摘要时所使用的密钥 private static $key='123456'; public function getToken(){ //这是第一部分 $base64 = json_encode(self::$header); $baseencode = base64_encode($base64); self::$payload['time']=time()+3600;//过期时间 self::$payload['uid']=110; $basepayLoad64=json_encode(self::$payload);

闲聊么

时光怂恿深爱的人放手 提交于 2020-03-01 14:18:25
闲聊几句 大概是一年前,我就已经了解过这款产品。当时也有过建站,但是没有坚持下来。现在是第二次尝试。在原先的基础上,增加了更多的自定义。在这里记录一下网站接入闲聊么的过程。 简单接入 xianliao.me 是支持最简洁的方式接入到你的网站的,只需要在他们的官网注册一个账号。你就能得到一个web_id和SSO_key。 根据上面的图片,只需要使用很简单的代码,就可以接入到你的网站。 但是 ,有一个非常现实的问题,如果访问者想要加入,必须使用微信扫一扫才能登录并且开始聊天。 相信不是流量特别大的网站,这一步应该可以劝退一大波的访问者了。所以就有了下文。我是如何通过他的API搭建起一个只需要输入一个随机用户名就能开始聊天的系统的。 分析API 在 xianliaome 的官网,我们发现他们提供了 定制代码接入 的功能,我们可以通过 手机端接入 API,模拟出一个“已登录用户”,提供给游客进行聊天。 在手机端接入闲聊么的方法: https://xianliao.me/s/你的web_id?mobile=1&uid={登录用户的ID}&username={登录用户的用户名,需要做URI encode}&avatar={登录用户的头像URL,需要做URI encode}&ts={当前的Linux timestamp}&token={即xlm_hash,见下附的xlm_hash的生成方法}

项目技术点剖析

这一生的挚爱 提交于 2020-03-01 11:54:59
1、使用Redis实现分布式部署单点登录(单点登录第一种方法:redis分布式存储解决方案) 因为这个项目是一个分布式部署的项目,而且我们采用的是nginx负载均衡的策略,导致了每一个服务器都需要开辟一个空间来进行用户信息的维护,消耗了大量的资源,所以,我当时使用到了Redis来作为维护用户信息的空间,将用户登录的信息存入Redis中,并且在存入时设置key的过期时间,所有的服务器共用一个Redis,每次进行操作时只需要去Redis中去判断这个用户是否存在,存在的话就说明这个用户现在是登录状态,不存在就说明这个用户没有登录,或者登录已经失效,让用户进行重新登录。 为什么会存在单点登录的问题 session默认是存储在当前服务器的内存中 ,如果是集群,那么只有登录那台机器的内存中才有这个session 比如说我在A机器登录,B机器是没有这个session存在的,所以需要重新验证 如何解决这个单点登录问题 不管在那一台web服务器登录,都会把token值存放到我们的一个集中管理的redis服务器中 但客户端携带token验证的时候,会先从redis中获取,就实现单点登录 现实举例 比如你写的一个tornado项目,分别部署到A,B两台机器上 如果直接使用session,那么如果在A机器登录,token只会在A服务器的内存 因为请求会封不到A,b连个机器,如果这个请求到了B机器

2.多方式登录

杀马特。学长 韩版系。学妹 提交于 2020-03-01 11:37:05
后台 插件 >: pip install djangorestframework-jwt urls.py path('login/', views.LoginViewSet.as_view({'post': 'login'})), views.py from rest_framework.viewsets import ViewSet from . import serializers, models from utils.response import APIResponse class LoginViewSet(ViewSet): # 局部禁用认证、权限组件 authentication_classes = () permission_classes = () def login(self, request, *args, **kwargs): serializer = serializers.LoginSerializer(data=request.data, context={'request': request}) if serializer.is_valid(): token = serializer.context.get('token') # 原来要一个个拿信息 # username = serializer.context.get('username') #

Django基础七之Ajax

为君一笑 提交于 2020-03-01 10:41:29
一 Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。     AJAX 不是新的编程语言,而是一种使用现有标准的新方法。     AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程) AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。       a.同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;       b.异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。   优点:AJAX除了 异步 的特点外,还有一个就是:浏览器页面 局部刷新 ;(这一特点给用户的感受是在不知不觉中完成请求和响应过程 示例   页面输入两个整数,通过AJAX传输到后端计算出结果并返回。     html文件名称为ajax_demo1.html,内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http

高并发情况下如何保证幂等性?

依然范特西╮ 提交于 2020-03-01 01:51:33
幂等性这个概念已经说烂了,就是不管你多少次执行多少次,产生的效果和返回的结果都是一样的。 1,select操作 在数据不变的情况下,select操作多次查询到的结果都是幂等的。 2.删除操作 删除语句内容不变的情况下,删除多次的结果也是一样的。但是得到返回值不是一样的。 3.唯一索引。 为了新增读脏数据。比如支付宝的资金账户,支付宝允许一个用户有一个支付宝账户,就是给资金账户表中的用户ID加的唯一索引,所以一个用户新增成功一个资金账户记录。当表中存在唯一索引的时候,并发新增会报错,再重新查询一次就可以了。 4.token机制。 防止页面重复提交。 业务要求:页面的数据只能被点击提交一次; 发生的原因:由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交; 解决方法:集群建立实用token加上redis(redis是单线程的,处理需要排队);单JVM环境:采用token加redis或者token加上JVM内存。 处理流程:1,数据提交前需要向服务申请token,token梵高redis或jvm内存中,token有效时间。 2,提交后后台检验token,同时删除token生成新token。 token特性:要申请,一次有效性,可以限流。 5.锁 可以使用乐观悲观和分布式锁实现。 来源: https://www.cnblogs.com/ffdsj/p/12387646

微信小程序获取并展示公众号推文

白昼怎懂夜的黑 提交于 2020-02-29 21:49:12
微信小程序获取并展示公众号推文 获取公众号access_token(开发环境) IP白名单设置 获取access_token 小程序前端展示 素材导入云数据库 云函数读取展示 注:笔者是小程序菜鸟,代码可能存在不足之处,有问题欢迎指正 笔者最近需要在小程序上实现一个展示关联公众号推文的方法,思路是先获取公众号的access_token,再通过access_token访问获取素材列表的api,然后将素材的url存进云数据库用于展示。 至于素材更新的时候如何对数据库进行更新,还没有想到如何解决,应该需要在后台写个定时更新access_token的逻辑,之后补充一下(同学提醒我可以偷偷懒,素材不多的话直接手动导url进数据库也可以,必要时进行更新,就没有access_token什么事了 关于 access_token ,官方文档是这么说的: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token 。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。 在 access_token 的使用及生成方式上,官方文档建议公众号开发者使用中控服务器统一获取和刷新 access_token

果然还是SB了

倖福魔咒の 提交于 2020-02-29 20:37:11
编译原理的龙书和虎书,各看了两章之后,¥……&……*……@%¥ 好吧,既然是码农,就要从基层做起,我尝试handwritten一下C或者C的极小子集的one-pass编译器先,等有了深切的体会再去研究那些高深的形式理论也不迟。于是,我花了几天搞了简单的词法分析,还费了一包子力,凭我那捉急的智商,凑出来一个像是语法树的东西,能解析四则运算表达式。书上说手写编译器用递归下降法最合适,我想了半天也不知道咋递归下降。。刚才看了看书上的简化手写语法分析器,一共才100行不到,我只好望书兴叹了,唉,底子完全不够硬啊,差得远啊。 写了几天hardcode的一点心得: 终于有点明白为什么书上要我们把文法的BNF产生式都列出来,然后再相应的为每个产生式写实现函数了, 这其实是在算法解耦 。 比如我们可以测试发现,下面的递归下降语法器是不支持unary operator的,比如3*-2。如果想加入这个运算规则,我们只需在文法中新加入一条规则,然后修缮文法,最后编码:在递归下降的层次中加入一个unary()函数,下层是factor(),上层是term(),完成。如此便可以通过加新的函数来扩展支持逻辑运算,比较运算。而如果像我那样hardcode的话。。。。。。。扩展的时候翔的感觉一下子就出来了。 而且考虑到类似这样的语法特性: a = b = c = 1; 利用递归下降法也能完美简洁的解决啊!