JWT权限验证

Bearer Authentication

a bearer token is: by presenting a valid token you will be automatically authenticated, without having to match or present any additional signature or details to prove.

It is often used in the OAuth 2.0.

In practice, a bearer token is usually presented using the HTTP Authorizationheader:

Authorization: Bearer BEARER_TOKEN

JSON Web Tokens (JWT)

是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。

JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。

Header.Payload.Signature

  • HEADER:A JSON object which indicates the type of the token (JWT) and the algorithm used to sign it. alg used to generate the signature
1
2
3
4
{
"alg":"HS256",
"typ":"JWT"
}
  • Payload: asserted claims of the entity. 如:
1
2
3
4
5
{
"sub":"1234567890",
"name":"John Doe",
"iat":2142138478
}

其中sub是subject。iat是issued at.

  • SIGNATURE: verify the token has not been tampered with.

把编码后的Header和Payload信息加在一起,一个密钥,然后使用一个强加密算法(header中指定的那个),如 HmacSHA256,进行加密。

客户端将获取到的“令牌”放到http请求的headers中后,向主服务系统发起请求。主服务系统收到请求后会从headers中获取“令牌”,并从“令牌”中解析出该用户的身份权限,然后做出相应的处理

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

协变和逆变 (C#)

如果一个泛型类型I<T>,根据类型参数 得出的结构,保留了赋值的兼容方向,那么这个泛型类型是协变的。

即如果一个泛型类型I,对于类型A和B,如果A能赋值给B,而且I<A>也能赋值给I<B>,即保留了赋值的兼容方向,那么说I<T>这个泛型类就是协变的。

相反,逆变就是反转了赋值的兼容方向。

不变就是既不是协变也不是逆变。

在 C# 中,协变和逆变允许 数组类型、委托类型和泛型类型 参数进行隐式引用转换。

朴素点说,协变逆变指的是模板参数(就是那个T啦)和模板类(比如IEnumerable<>,List<>,Action<>,之类的)之间保持“is a”关系的联动。

背景知识:协变和反变

任何类型T都有其对应的数组类型T[]。

那么我们的问题就来了,如果两个类型T和U之间存在一种安全的隐式转换,那么对应的数组类型T[]和U[]之间是否也存在这种转换呢?这就牵扯到了将原本类型上存在的类型转换映射到他们的数组类型上的能力,这种能力就称为“可变性(Variance)”。

在.NET世界中,唯一允许可变性的类型转换就是由继承关系带来的“子类引用->父类引用”转换。举个例子,就是String类型继承自Object类型,所以任何String的引用都可以安全地转换为Object引用。

我们发现String[]数组类型的引用也继承了这种转换能力,它可以转换成Object[]数组类型的引用,

数组这种与原始类型转换方向相同的可变性就称作协变(covariant)。

数组不支持反变性,

这个泛型接口支持对T的协变

.NET 4.0引入的泛型协变、反变性

但在.NET 4.0之前,无论C#还是VB里都不支持泛型接口的可变性。

不过它们都支持委托参数类型的协变和反变。委托参数类型的可变性理解起来抽象度较高。
在.NET 4.0之前为什么不允许IFoo<T>进行协变或反变呢?因为对接口来讲,T这个类型参数既可以用于方法参数,也可以用于方法返回值。
.NET 4.0改进了什么呢?它允许在类型参数的声明时增加一个额外的描述,以确定这个类型参数的使用范围。
我们看到,如果一个类型参数仅仅能用于函数的返回值,那么这个类型参数就对协变相容。而相反,一个类型参数如果仅能用于方法参数,那么这个类型参数就对反变相容。