程序员应该如何设计更优雅的Token认证方式

程序员应该如何设计更优雅的Token认证方式,第1张

把认证信息保存在客户端,关键点就是安全的验证,如果能解决认证信息的安全性问题,完全可以把认证信息保存在客户端,服务端完全无认证状态,这样的话服务端扩展起来要方便很多。关于信息的安全解决方案,现在普遍的做法就是签名机制,像微信公众接口的验证方式就基于签名机制。签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。当用户成功登系统并成功验证有效之后,服务器会利用某种机制产生一个token字符串,这个token中可以包含很多信息,例如来源IP,过期时间,用户信息等, 把这个字符串下发给客户端,客户端在之后的每次请求

中都携带着这个token,携带方式其实很自由,无论是cookie方式还是其他方式都可以,但是必须和服务端协商一致才可以。当然这里我不推荐cookie。当服务端收到请求,取出token进行验证(可以验证来源ip,过期时间等信息),如果合法则允许进行 *** 作。基于token的验证方式也是现代互联网普通使用的认证方式,那它有什么优点

1支持跨域访问,Cookie是不允许垮访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过>

2无状态:Token机制在服务端不需要存储session信息,因为Token自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息

3解耦 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可

4适用性更广:只要是支持>

5服务端只需要验证token的安全,不必再去获取登录用户信息,因为用户的登录信息已经在token信息中。

6基于标准化:你的API可以采用标准化的 JSON Web Token (JWT) 这个标准已经存在多个后端库(NET, Ruby, Java,Python,PHP)和多家公司的支持(如:Firebase,Google, Microsoft)

session session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开中国站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个 *** 作请求到了另一台服务器的时候session会丢失。 cookie cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一中国站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。 cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"\")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(>

一般有五种方式:

1、Token授权认证,防止未授权用户获取数据;

2、时间戳超时机制;

3、URL签名,防止请求参数被篡改;

4、防重放,防止接口被第二次请求,防采集;

5、采用>

token(令牌)和sign(签名)的区别:Token:令牌是用来判断用户身份的一个标识。Sign:签名是服务端在接受到用户请求的时候判断该请求是否是来自于自己允许的平台(自己允许的平台有统一的加密规则)。

在实际开发工作中应该先通过webfilter解密,解密后进行验证签名(返回数据时,过程反过来,先签名再加密)。然后再springmvc的Interceptor中进行验证token。

我们来继续前两章( OAuth2 总结 , 对OpenID Connect的理解 )的讨论,进入对JWT的理解。先来简单回顾一下OAuth2和OpenID:

OpenID建立在OAuth之上,完成了认证和授权。而认证和授权的结果就体现在这个ID token之上,而这个ID token通常会是JWT。那么为什么会是JWT呢?我们通过以下几点来逐一解释。

JWT RFC 7519 给出了官方定义的一些字段:

当然也不限于此,可以根据自己的需要,添加其他字段。到此,我们可以看出JWT提供了ID token所需要的能力。一个完整的JTW是由三部分组成:Header,Payload,Signature。三者之间由 隔开,刚才提到的认证授权的字段就存在于Payload中。

Header中存放的是JTW的元数据,包含签名的算法以及token的类型,如下所示:

Signature部分是对前两部分的签名, 防止数据篡改 。首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

算出签名以后,把 Header、Payload、Signature三个部分经过base64序列化为三个字符串,再讲三个字符串由 为间隔拼接成一个字符串返回给客户端。

ID Token需要有足够的安全性,JWT是如何做到的呢?

刚看到了签名部分,签名的作用只是为了防止数据篡改,而JWT默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。比如认证服务器中使用私钥进行加密,把公钥分发给其他应用服务器,应用服务拿到加密后的token后用公钥解密,获取到JWT,再用签名的秘钥来验证数据是否经过的篡改。

我们来看看还有神马其他备选么?Simple Web Tokens (SWT)和Security Assertion Markup Language Tokens (SAML)。

JWT vs SAML:JWT基于json,而SAML基于XML,在大小上就有足够的优势,更适用于HTML和>

最近遇见一个好玩的bug, 现象是页面刷新白屏,RootCause是Header里放的cookie太多了, 大小超出了4kb的限制. 解决方法很简单,拆出一部分放到LocalStorage.问题解决了,但是个人觉得很有意思,平常司空见惯的,觉得"假大空不接地气"的概念,其实都真真切切的在项目中体现了,只不过我们熟生轻视,看不见而已.遂记录本文. 面试的时候经常喜欢问一个问题,>

参考: >

安全

在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目中,大多数采用保存的session中,然后在存一份到cookie中,来保持用户的回话有效性。但是在app提供的开放接口中,后端服务器在用户登录后如何去验证和维护用户的登陆有效性呢,以下是参考项目中设计的解决方案,其原理和大多数开放接口安全验证一样,如淘宝的开放接口token验证,微信开发平台token验证都是同理。

签名设计

对于敏感的api接口,需使用>

以上就是关于程序员应该如何设计更优雅的Token认证方式全部的内容,包括:程序员应该如何设计更优雅的Token认证方式、jssdk 明明获取到token的值。我想启用服务器!需要带入token值。但是却显示错误,事实、保障接口安全的5种常见方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9797393.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)