首页 » OpenStack系统架构设计实战 » OpenStack系统架构设计实战全文在线阅读

《OpenStack系统架构设计实战》11.2.3 用户认证和令牌获取

关灯直达底部

用户的认证主要由两种方式,一种是用户名密码方式认证,另一种是基于令牌的认证。

用户名密码方式认证就是本地认证,这类用户的信息保存在Keystone数据库中,其核心操作是通过后端动器去做密码的校验,就是对传入的明文做一次SHA512的Hash操作,再与数据库中存放的散列之后的密码进行比对。

基于令牌的认证是当用户请求认证时,其令牌信息包含在请求消息中,Keystone会剥离HTTP请求Header中的令牌信息,进行Hash计算并与数据库中保存的令牌值进行比对,以确认是否有效。令牌在请求中的作用相当于用户名和密码。

目前V3-API还在发展过程中,而V1-API已经成熟,并且OpenStack中其他项目默认调用的仍然是V1-API,这里重点以V1-API的请求为基础,介绍Keystone的用户认证及令牌获取的工作流程。

下面以POST/v2.0/tokens为例来介绍Keystone在用户认证以及令牌获取的工作流程。

用户首先发起一个有效的curl请求,请求对用户的账号进行验证,并生成一个与租户进行绑定的令牌。

$ curl -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "*", "password": "*"}}}' -H"Content –type: application/json" http://$IP:35357/v2.0/tokens | python - mjson.toolKeystone调用authenticate方法对用户信息进行认证。Class Auth(controller.V2Controller): def authenticate(self, context, auth=None):

其中第三个参数auth就是curl请求中的传入参数,及此租户下用户名及密码。authenticate()针对不同的认证方式分别进行处理。

Keystone完成用户的认证之后,authenticate()会检查该用户、租户、域是否可用,过滤不需要返回给用户的数据,并调用Catalog API构造服务目录,最后通过后端生成令牌。令牌的生成有3种方式,默认使用UUID的方式。

1)UUID:调用Python库函数生产一个随机的UUID(通用唯一识别码)作为令牌的ID。

2)PKIZ:使用OpenSSL对用户相关信息进行签名,签名后的格式为DER,并以此生产令牌ID。

3)PKI:使用OpenSSL对用户相关信息进行签名,与PKIZ不同的是生成的签名格式为PEM。

Keystone用户认证的流程如图11-2所示。

图11-2 Keystone用户认证流程