如果你使用rest call,无论是curl,requests还是自己实现httpclient,前面已经说了拿token,再用token去call命令(早起的时候比这个还要复杂,涉及到scope,unscope的
问题),如果你用keystone client比如:
keystone_client=keystoneclient.v2_0.client.Client(xxxxx);
如何传递参数,xxx是什么。
这个时候你脑子可能会想起一堆东西,比如像我原来一样有疑问,
1. 在配置keystone的时候,我们生成了一个admin_token,而且在create tenant的时候,有:
export OS_SERVICE_TOKEN=ADMIN_TOKEN
export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
然后执行 keystone tenant-create xxx
2. 配置好了之后,我们ssh到controller上,使用source keystonerc_admin或者source keystonerc_demo
然后执行keystone tenant-list
3.还能怎么用client
其实最好的办法还是看源码,不过这个问题看keystone client的Client类注释就大概知道了,因为在注释中给出了三种keystone client的调用方法,对应的
也有个1,2,3:
1. 对应上面的第一条,
>>> from keystoneclient.v2_0 import client
>>> admin_client = client.Client(
... token='12345secret7890',
... endpoint='http://localhost:35357/v2.0')
>>> admin_client.tenants.list()
严格来说这种使用方式,比较危险,可以说只要一个token就获得了超级权限,很多时候配置好了之后可以选择将次token删除(貌似可以设置过期时间,没有深究)
2.对应上面第二条,
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(username=USER,
... password=PASS,
... tenant_name=TENANT_NAME,
... auth_url=KEYSTONE_URL)
>>> keystone.tenants.list()
这个和rest call传递的参数很像,有user name和passwd,有tenant的信息,有auth_url(auth_url对admin和public的一样,前面已经说了原因,因为在router中
对应的是一样的controller),基本上是rest call 的翻版
3.对应上面的第三条,
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(username=USER,
... password=PASS,
... tenant_name=TENANT_NAME,
... auth_url=KEYSTONE_URL)
>>> auth_ref = keystone.auth_ref
>>> # pickle or whatever you like here
>>> new_client = client.Client(auth_ref=auth_ref)
这个的好处是,如果你要多个client,同时这些client都是用相同的认证,那么你可以拿到auth_ref,然后在每个需要相同认证的client处
用此auth_ref得到client。
ps:纠正一下,这里的鉴权应该是认证,而鉴权是policy做的事情,之后会说。
在说之前,我上几篇中掉了一点儿东西没说,不错就是context这个很神秘的东西,我们一般说上下文,什么是上下文,上下文这个东西是哪里来的?
其实每个模块都有这个东西,不过现在在说keystone,就来讲讲keystone中这个所谓的上下文在哪儿:
我们看拿到token的rest call通过controller执行函数(前面已经说过了):
def authenticate(self, context, auth=None):
xxxx
这里就有个context上下文,是不是莫名其妙,不知道这个传的什么东西,在mapper的时候也没有指定啊,那我们从client看:
在TokenManager中的方法 def authenticate,
def authenticate(self, username=None, tenant_id=None, tenant_name=None,
password=None, token=None, return_raw=False):
if token:
params = {"auth": {"token": {"id": token}}}
elif username and password:
params = {"auth": {"passwordCredentials": {"username": username,
。。。。
args = ['/tokens', params, 'access']
kwargs = {'return_raw': return_raw, 'log': False}
。。。。
token_ref = self._create(*args, **kwargs)
。。。。
挑几行红色的看看,即知道了,所谓的context就是穿进去的这些个参数,对rest call来说,最后都会成为requst的post body(如果是post方法的话)。
到目前为止,如果ssl.enable是false的话,已经可以了,但是如果为了安全,或者是用了pki的token provider,你得配置ssl(security socket layer)相关的东西,
最后就说说keystone中的几个看起来很唬人的文件和意义好了。
本文详细解析了如何使用Keystoneclient在OpenStack环境中进行身份验证和资源访问,包括通过token、用户名和密码的方式,以及如何利用auth_ref进行多客户端认证。此外,文章还介绍了上下文的概念及其在Keystone中的应用。
1960

被折叠的 条评论
为什么被折叠?



