此处以OpenStack mitaka版本为例,实际最新的Ocata版本也差不多,keystone的管理端口为35357,公共服务端口为5000,用户认证的方式包括用户密码认证和admin_token认证两种方式。客户端的authenticate()方法主要完成三个主要工作:a.尝试从本地获取token。b.本地没有token设置为强制更新,从服务器获取token。c.将新的token保存在本地。服务器端的admin_token认证方式判断客户端发传来的token与配置文件里的admin_token是否一致,用户密码认证方式authenticate()方法主要完成三个工作:a.如果报文中有token这个字段,则进行token认证。b.尝试外部认证。c.尝试本地认证。一个token有三个重要的属性:ID、用户信息、服务目录。
以获取某个用户信息为例分析keystonev2.0源码。
客户端:
加载用户资源。
/keystoneclient/v2_0/client.py
class Client(httpclient.HTTPClient):
def __init__(self, **kwargs):
...
self.users = users.UserManager(self._adapter, self.roles)
...
设置请求的url和userid参数。
/keystoneclient/v2_0/users.py
class UserManager(base.ManagerWithFind):
...
def get(self, user):
return self._get("/users/%s" % base.getid(user), "user")
...
最终调用HTTPClient发送GET请求
class Manager(object):
...
def _get(self, url, response_key, **kwargs):
resp, body = self.client.get(url, **kwargs)
return s