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服务里请求token,其中body就是返回的token。
Keystone部分的代码主要是:/keystone/token/controllers.py
这里获取token返回给novaclient
其中该函数主要是获取management_url:
格式如http://10.28.175.2:8774/v2/5c1dc17726f74c5b98835b4be1e233ec
之后回到/usr/lib/python2.6/site-packages/novaclient/client.py
357行:
这里验证如果没有取到management_url则报没有权限的异常
之后根据获取的token和url组装http请求,访问nova-api:
中间要访问keystoneclient来验证带着的token是否正确:
/usr/lib/python2.6/site-packages/keystoneclient/middleware/auth_token.py
这里验证token,如果不正确则抛出无权限,并停止继续访问nova-api
继续看看是如何验证的:
如果token不正确则此处抛出异常
如果检测到是签名的token:
这里会去keystone中请求revocation_list,在请求的时候如果keystone的token的driver配的是sql,则会去查询keystone的token表中的过期token,由于token是根据时间递增的,时间过长会非常庞大,所以查询可能出现超时,导致这里返回失败。如果使用memchache的话需要将-I参数设置大点如10M,否则会出错,但是设置大后会加重内存负担。如果使用noauth模式的话就不会走这里的验证过程了。
接着之前的验证说:
/usr/lib/python2.6/site-packages/keystoneclient/common/cms.py
将签名转化为需要的字典,字典里包括user role 等之前从keystone获取的数据
如果检测不是签名的token则走下面:
再次请求keystone服务进行token的验证:请求地址为:/v2.0/tokens/{token}
通过/usr/lib/python2.6/site-packages/keystone/common/wsgi.py
走到/usr/lib/python2.6/site-packages/keystone/common/controller.py:
/usr/lib/python2.6/site-packages/keystone/token/core.py
../token/backends/sql.py
在这里去数据库中的token表中查询参数token_id是否存在,如果不存在则报没权限。存在则返回相关数据,包括endpoint、user、role等
之后发送到nova-api:/usr/lib/python2.6/site-packages/nova/api/auth.py进行数据检查
通过wsgi最后到/usr/lib/python2.6/site-packages/nova/api/openstack/compute/servers.py
由此可见该context其实是从keystone中获取一路传到nova api中,并使用其中数据进行过滤获取需要的数据。
../nova/compute/api.py
../nova/objects/instance.py
../nova/db/api.py
../nova/db/sqlalchemy/api.py
下面是client去keystone中获取的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']}}}