Keystone验证过程

Keystone验证过程

使用nova list命令跟踪:

/usr/lib/python2.6/site-packages/novaclient/shell.py

667


其中self.cs.authenticate()主要是去keystone获取token ,具体方法如下:

 

/usr/lib/python2.6/site-packages/novaclient/client.py

301行:

Keystone验证过程_第1张图片



Keystone验证过程_第2张图片


Keystone验证过程_第3张图片

 


 


上面是去keystone服务里请求token,其中body就是返回的token

Keystone部分的代码主要是:/keystone/token/controllers.py

Keystone验证过程_第4张图片


Keystone验证过程_第5张图片


这里获取token返回给novaclient

Keystone验证过程_第6张图片

其中该函数主要是获取management_url

格式如http://10.28.175.2:8774/v2/5c1dc17726f74c5b98835b4be1e233ec

 

之后回到/usr/lib/python2.6/site-packages/novaclient/client.py

357行:

 


这里验证如果没有取到management_url则报没有权限的异常

 

之后根据获取的tokenurl组装http请求,访问nova-api

中间要访问keystoneclient来验证带着的token是否正确:

/usr/lib/python2.6/site-packages/keystoneclient/middleware/auth_token.py


这里验证token,如果不正确则抛出无权限,并停止继续访问nova-api

继续看看是如何验证的:

Keystone验证过程_第7张图片

如果token不正确则此处抛出异常

如果检测到是签名的token



Keystone验证过程_第8张图片


Keystone验证过程_第9张图片


Keystone验证过程_第10张图片


这里会去keystone中请求revocation_list,在请求的时候如果keystonetokendriver配的是sql,则会去查询keystonetoken表中的过期token,由于token是根据时间递增的,时间过长会非常庞大,所以查询可能出现超时,导致这里返回失败。如果使用memchache的话需要将-I参数设置大点如10M,否则会出错,但是设置大后会加重内存负担。如果使用noauth模式的话就不会走这里的验证过程了。

接着之前的验证说:

/usr/lib/python2.6/site-packages/keystoneclient/common/cms.py

将签名转化为需要的字典,字典里包括user role 等之前从keystone获取的数据

Keystone验证过程_第11张图片

 

如果检测不是签名的token则走下面:

Keystone验证过程_第12张图片

再次请求keystone服务进行token的验证:请求地址为:/v2.0/tokens/{token}

通过/usr/lib/python2.6/site-packages/keystone/common/wsgi.py

Keystone验证过程_第13张图片

走到/usr/lib/python2.6/site-packages/keystone/common/controller.py:

Keystone验证过程_第14张图片

 

Keystone验证过程_第15张图片

/usr/lib/python2.6/site-packages/keystone/token/core.py

Keystone验证过程_第16张图片



../token/backends/sql.py

Keystone验证过程_第17张图片

在这里去数据库中的token表中查询参数token_id是否存在,如果不存在则报没权限。存在则返回相关数据,包括endpointuserrole

 

之后发送到nova-api/usr/lib/python2.6/site-packages/nova/api/auth.py进行数据检查

Keystone验证过程_第18张图片


Keystone验证过程_第19张图片


通过wsgi最后到/usr/lib/python2.6/site-packages/nova/api/openstack/compute/servers.py

Keystone验证过程_第20张图片

Keystone验证过程_第21张图片


 Keystone验证过程_第22张图片



由此可见该context其实是从keystone中获取一路传到nova api中,并使用其中数据进行过滤获取需要的数据。

../nova/compute/api.py


Keystone验证过程_第23张图片

Keystone验证过程_第24张图片

Keystone验证过程_第25张图片

../nova/objects/instance.py

Keystone验证过程_第26张图片

../nova/db/api.py

Keystone验证过程_第27张图片

../nova/db/sqlalchemy/api.py

Keystone验证过程_第28张图片


Keystone验证过程_第29张图片


Keystone验证过程_第30张图片


Keystone验证过程_第31张图片


Keystone验证过程_第32张图片


Keystone验证过程_第33张图片


下面是clientkeystone中获取的token_date数据格式:

{u'access': {u'token': {u'issued_at': u'2014-01-14T23:20:16.601634', u'expires': u'2014-01-15T23:20:16Z', u'id': u'签名', u'tenant': {u'enabled': True, u'description': u'', u'name': u'test', u'id': u'5c1dc17726f74c5b98835b4be1e233ec'}}, u'serviceCatalog': [{u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:8774/v2/5c1dc17726f74c5b98835b4be1e233ec', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:8774/v2/5c1dc17726f74c5b98835b4be1e233ec', u'internalURL': u'http://10.28.175.2:8774/v2/5c1dc17726f74c5b98835b4be1e233ec', u'id': u'201dc6c513df4e7c953405e8ae495803'}], u'type': u'compute', u'name': u'nova'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:9696/', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:9696/', u'internalURL': u'http://10.28.175.2:9696/', u'id': u'2464ad002f8a4b2486acb180fa46913f'}], u'type': u'network', u'name': u'neutron'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:8080', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:8080', u'internalURL': u'http://10.28.175.2:8080', u'id': u'3663076c469b4d55864bab9708c3b185'}], u'type': u's3', u'name': u'swift_s3'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:9292', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:9292', u'internalURL': u'http://10.28.175.2:9292', u'id': u'0788f8a83ef54b2886ffc74dea6c1173'}], u'type': u'image', u'name': u'glance'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:8777', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:8777', u'internalURL': u'http://10.28.175.2:8777', u'id': u'47a0a0d46c6a4f6b97bfdb74999b144a'}], u'type': u'metering', u'name': u'ceilometer'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:8776/v1/5c1dc17726f74c5b98835b4be1e233ec', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:8776/v1/5c1dc17726f74c5b98835b4be1e233ec', u'internalURL': u'http://10.28.175.2:8776/v1/5c1dc17726f74c5b98835b4be1e233ec', u'id': u'04da75ed5f274f14a9eeb65e2c9fabbe'}], u'type': u'volume', u'name': u'cinder'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:8773/services/Admin', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:8773/services/Cloud', u'internalURL': u'http://10.28.175.2:8773/services/Cloud', u'id': u'33e98ee8555742f686bbb34a6de1e1dd'}], u'type': u'ec2', u'name': u'nova_ec2'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:8080/', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:8080/v1/AUTH_5c1dc17726f74c5b98835b4be1e233ec', u'internalURL': u'http://10.28.175.2:8080/v1/AUTH_5c1dc17726f74c5b98835b4be1e233ec', u'id': u'214c54619e39475f8a819435b27e8b4a'}], u'type': u'object-store', u'name': u'swift'}, {u'endpoints_links': [], u'endpoints': [{u'adminURL': u'http://10.28.175.2:35357/v2.0', u'region': u'RegionOne', u'publicURL': u'http://10.28.175.2:5000/v2.0', u'internalURL': u'http://10.28.175.2:5000/v2.0', u'id': u'3487a8d6a4184479afb36f17b05879a4'}], u'type': u'identity', u'name': u'keystone'}], u'user': {u'username': u'yzy', u'roles_links': [], u'id': u'c2558f7cf6884aff9bddc7b171e0b59a', u'roles': [{u'name': u'Member'}], u'name': u'yzy'}, u'metadata': {u'is_admin': 0, u'roles': [u'ff39f26d445f46338c399491fdbe65f2']}}}

你可能感兴趣的:(keystone)