Keystone 用户认证
1、keystone简介
keystone的认证,因为版本原因,同样也分为version 2与version 3,并且version2与3分属不同模块(下述所指模块均基于keystone),version2的代码集中于keystone.token模块,version3的代码集中于keystone.auth模块。
keystone各部件的代码组成主要包括routers、controllers、core、backends(包括sql、kvs等),其中routers主要负责url与action映射,core负责manager api的操作,通俗来讲就是为controller提供api接口,为backends各种后端驱动封装接口,是一种适配器的功能,backends主要提供各种后端存储等操作。
认证的路径URL分别如下:
version2:/tokens对应操作:authenticate
/tokens/revoked对应操作:revocation_list
/tokens/{token_id} 对应validation_token,validate_token_head,delete_token
/tokens/{token_id}/endpoints 对应操作:token_controller
/certificates/ca对应操作ca_cert
/certificates/signing对应操作signing_cert
version3: /auth/tokens
对应操作:validate_token,checl_token,authenticate_for_token,revoke_token
/auth/tokens/OS-PKI/revoked
对应操作:revocation_list
/auth/catalog
对应操作:get_auth_catalog
/auth/domains
对应操作:get_auth_domains
上述URL定义以及对应操作的映射分别在keystone.auth.routers和Keystone.token.routers,所映射的操作分别在keystone.auth.controllers和keystone.token.controllers.
其中,auth部件,主要负责各种认证,token部件负责是token的认证,持久化等操作,所以才有了auth与token功能交叉的部分,也就是V2与V3在token认证上的差异.
2、keystone认证
keystone默认配置的认证方法主要有external、password、token、oauth1.
而auth.plugins中目前支持的增加了saml2,也就是liberty版本中的WEBSSO.
下面我们讨论的主要包括password、token、以及external,在对单个认证方式分析时,会同时分析v2与v3的差异。
V3中涉及的概念:project,domain,group,user,trust等,其中domain管理project,group,group管理user,因此,在检测group是否enabled的时候,需要首先检测其所归属集合是否enabled,这个编程涉及思路贯彻始终。
接下来,我们首先介绍version 3的认证流程。
2.1 keystone v3认证
处理函数:authenticate_for_token
def anthenticate_for_token(self, context, auth=None):
# context就是上下环境,auth是输入的字典
# auth的类型有如下几种,这些都是来至官网,对照代码理解无误,请放心!
第一种是username 配合password,因为username不是主键,所以要搭domain,domain可以id或者name方式
{ "auth":
{ "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "example.com" }, "name": "Joe", "password": "secretsecret" } } } }}
第二种是username 配合password domain id
{ "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "id": "1789d1" },