OpenStack跨模块认证
我们知道OpenStack模块之间相互都需要配置认证信息用于HTTP请求认证,比如Nova向neutron发送请求配置如下:
这个配置有何用?
当一个用户从portal发起一个操作时,比如创建一个虚拟机。此时用户需要经过keystone的认证,并且获取合规的token,然后拿着token向nova发起一个创建虚拟机的请求。请求来到nova模块,nova需要去keystone那里确认此token的合法性,这个时候向keystone发起确认一个token合法性的时候就需要一个身份,这就是以上跨模块访问时需要一个身份配置。token确认合法后,nova才向neutron发起请求。当neutron收到一个请求时还要确认租户信息的合法性。
我们先看下neutron执行流程的pipeline:
[composite:neutronapi_v2_0]
use = call:neutron.auth:pipeline_factory
noauth = request_id catch_errors extensions neutronapiapp_v2_0
keystone = request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0
其中authtoken是认证的关键处理
/keystonemiddleware/auth_token/__init__.py代码片段:
def filter_factory(global_conf, **local_conf):
"""Return a WSGI filter app for use with paste.deploy."""
conf = global_conf.copy()
conf.update(local_conf)
def auth_filter(app):
return AuthProtocol(app, conf)
return auth_filter
其中AuthProtocol继承BaseAuthProtocol,也就是说根据wsgi规范会调用BaseAuthProtocol的__call__函数.
@webob.dec.wsgify(RequestClass=_request._AuthTokenRequest)
def __call__(self, req):
"&