【问题标题】:Good way/place to authenticate Keystone/Openstack API from Django从 Django 验证 Keystone/Openstack API 的好方法/地方
【发布时间】:2023-01-04 23:58:40
【问题描述】:

这是我在 Stackoverflow 上的第一篇文章,我是 Django 的新手,希望您能理解。

我想使用 Django 提供一个带有身份验证的门户,它必须使用 Keystone/Openstack API 来创建/删除项目、授予/删除权限。

Openstack 提供了一个 RestFul API,我必须在其上进行身份验证(我提供凭据,然后接收回令牌)。 我有 2 种可能性来访问此 API:

  1. 使用 python 客户端:python-keystoneclient
  2. 直接使用restful API

    不要介意选项 1 或 2,我能够登录并与 API 交互,我在视图中执行此操作。

    我的问题是,每次更改页面/视图时,我都必须再次进行身份验证。我不知道如何在其他视图中使用/共享“会话或客户端对象”。

    >>> from keystoneauth1.identity import v3
    >>> from keystoneauth1 import session
    >>> from keystoneclient.v3 import client
    >>> auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
    ...                    user_id='myuserid',
    ...                    password='mypassword',
    ...                    project_id='myprojectid')
    >>> sess = session.Session(auth=auth)
    >>> keystone = client.Client(session=sess, include_metadata=True)
    

    我尝试使用request.sessionrequest.session.get 将该对象作为会话变量传递,但该对象不可序列化。我序列化了它,但我不能在另一个视图上使用它。

    也许我不应该在视图中访问 API? 我确定我不是这个用例中的第一个,不管远程 API 是什么。但是我在谷歌上搜索了很多都没有找到合适的方法。也许我没有用正确的词搜索

    谢谢你的帮助。

【问题讨论】:

    标签: django api session openstack keystone


    【解决方案1】:

    我是这样做的,效果很好:

    在 apps.py 中:

    from django.apps import AppConfig
    from keystoneauth1.identity import v3
    from keystoneauth1 import session
    from keystoneclient.v3 import client
    
    class MyAppConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'mySharedVar'
        auth = v3.Password(auth_url='https://my.keystone.com:5000/v3', user_id='myuserid', password='mypassword',project_id='myprojectid')
        ses1 = session.Session(auth=auth)
    

    在我看来,我现在可以通过以下方式访问“共享变量”:

    from keystoneauth1.identity import v3
    from keystoneauth1 import session
    from keystoneclient.v3 import client
    
    @login_required
    def list_project(request):
        sharedVar=apps.get_app_config('mySharedVar')
        keystone = client.Client(session=sharedVar.ses1, include_metadata=True)
        pl = keystone.projects.list()
        context = {
            "title": "Project List",
            "projects": pl.data
        }
        return render(request, "myapp/list_project.html",context=context)
    

    我希望这可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多