边缘认证和与令牌无关的身份传播 (3)

如上所述,Passport 模型为一个Protocol Buffer。从高层看,Passport 的定义如下:

message Passport { Header header = 1; UserInfo user_info = 2; DeviceInfo device_info = 3; Integrity user_integrity = 4; Integrity device_integrity = 5; }

Header元素传达了创建Passport的服务的名称。更有意义的是传播的与用户和设备有关的内容。

用户&设备信息

UserInfo 元素包含识别发起请求的用户所需的所有信息,DeviceInfo 元素包含用户访问Netflix的设备所需的所有信息:

message UserInfo { Source source = 1; int64 created = 2; int64 expires = 3; Int64Wrapper customer_id = 4; … (some internal stuff) … PassportAuthenticationLevel authentication_level = 11; repeated UserAction actions = 12; } message DeviceInfo { Source source = 1; int64 created = 2; int64 expires = 3; StringValue esn = 4; Int32Value device_type = 5; repeated DeviceAction actions = 7; PassportAuthenticationLevel authentication_level = 8; … (some more internal stuff) … }

UserInfo和DeviceInfo 包含了请求的Source和PassportAuthenticationLevel。Source是一个声明类型列表,为使用的协议以及用于验证声明的服务。PassportAuthenticationLevel为放到认证声明中的信任的级别。

enum Source { NONE = 0; COOKIE = 1; COOKIE_INSECURE = 2; MSL = 3; PARTNER_TOKEN = 4; … } enum PassportAuthenticationLevel { LOW = 1; // untrusted transport HIGH = 2; // secure tokens over TLS HIGHEST = 3; // MSL or user credentials }

下游应用可以使用这些值来进行授权或决定用户体验。

Passport 的完整性

Passport 的完整性由HMAC保证(基于哈希的消息认证码),HMAC是一种特定类型的MAC,涉及密码哈希函数和密钥,可以同时用于校验数据完整性和消息的真实性。

用户和设备的完整性定义如下:

message Integrity { int32 version = 1; string key_name = 2; bytes hmac = 3; }

当Integrity的version为1表示为HMAC使用SHA-256,编码为ByteArray。未来Integrity的version可能使用一个不同的哈希函数或编码。在version为1时,HMAC字段包含MacSpec.SHA_256中的256位。

完整性防护保证Passport 字段在Passport创建之后不会改变。客户端应用可以在使用其中包含的任何值之前,通过Passport Introspector检查Passport的完整性。

Passport Introspector

Passport对象本身是不透明的。客户端可以使用Passport Introspector从首部抽取Passport,并检索其中的内容。Passport Introspector是Passport二进制数据的包装器。客户端可以通过一个工厂创建一个Introspector,然后就访问基本的访问器方法:

public interface PassportIntrospector { Long getCustomerId(); Long getAccountOwnerId(); String getEsn(); Integer getDeviceTypeId(); String getPassportAsString(); … } Passport Actions

下面定义了Passport 协议缓冲,以及Passport Actions 的定义:

message UserInfo { repeated UserAction actions = 12; … } message DeviceInfo { repeated DeviceAction actions = 7; … }

当对用户或设备身份进行更新时,下游服务会显示地发送一个Passport Actions。EAS 会使用该信号来创建或更新对应类型的令牌。

重新审视登录流程

让我们总结一下所有这些解决方案一起工作的例子。

在将认证和协议终结转移到边缘,并引入Passports作为身份之后,前面所述的登录流程演变为了以下内容:

边缘认证和与令牌无关的身份传播

用户输入凭据,Netflix客户端将设备ESN和凭据传送到边缘网关,即Zuul;

Zuul上运行的身份过滤器会生成一个绑定设备的Passport,然后将其传送到API/登录终端;

API服务将Passport传播到负责认证用户的中间层服务;

在成功认证提供的声明之后,这些服务会创建并发送一个Passport Action(伴随原始Passport),同时将流备份到API和Zuul;

Zuul会调用Cookie服务来解析Passport和Passport Actions,然后将Cookies返回Netflix客户端。

主要的好处 简化授权

存在外部令牌流入下游系统的原因是,授权决策经常会依赖令牌中的认证声明,且信任与各种令牌类型相关联。在我们的Passport结构中为信任分配了不同的级别,意味着,需要授权决策的系统可以围绕Passport编写合理的规则,而无需在很多服务的代码中重复信任规则。

显示的,可扩展的身份模型

具有规范身份的结构非常有用。传递身份原始数据的方式比较脆弱且难以调试。如果在一个调用声明中,用户的身份从服务A切换到了服务D,那么谁会发生改变?一旦身份结构通过所有关键系统,一种相对简单的方式是添加一个新的外部令牌类型,新的信任级别,以及新的方式来表示该身份。

操作问题和可见性

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyygwz.html