【问题标题】:openstack cannot retrieve authentication token from APIopenstack 无法从 API 检索身份验证令牌
【发布时间】:2018-07-03 11:10:53
【问题描述】:

我正在尝试使用来自 python 的请求库从 API 检索身份验证令牌。这是我到目前为止所做的尝试:

def get_token():
    data = { 
      "auth" : {
         "identity" : { 
            "methods" : [ "password" ],
            "password": { 
               "user" : { 
                  "name"  : OS_USERNAME,
                  "domain": { "name": "Default" },
                  "password": OS_PASSWORD
               }
            }
         }
      }   
    }

    r = requests.post(
    OS_AUTH_URL+'/auth/tokens',
      headers = HEADERS,
      json    = data,      # https://stackoverflow.com/questions/9733638
      verify  = False
    )
    print(r.content)
    j = json.loads(r.content)
    return j['token']['user']['id']

我在响应中得到了令牌:

{
  "token": {
    "issued_at": "2018-07-03T11:03:59.000000Z",
    "audit_ids": [
      "Fg1ywtZBQ1CkigCw70If9g"
    ],
    "methods": [
      "password"
    ],
    "expires_at": "2018-07-03T12:03:59.000000Z",
    "user": {
      "password_expires_at": null,
      "domain": {
        "id": "default",
        "name": "Default"
      },
      "id": "e0dc5beb383a46b98dad824c5d76e719",
      "name": "admin"
    }
  }
}

但是,当我重用此令牌以获取例如项目列表时:

def get_tenantID():
  r = requests.get(
    OS_AUTH_URL+'/auth/projects',
    headers = HEADERS,
    verify  = False
  )
return r
r = get_token()
HEADERS['X-Auth-Project-Id'] = 'admin'
HEADERS['X-Auth-Token'] = r
r = get_tenantID()

我收到此错误,好像我不会通过身份验证:

<Response [401]>
{"error": {"message": "The request you have made requires authentication.", "code": 401, "title": "Unauthorized"}}

谷歌搜索并使用openstack token issue 命令告诉我,通常,令牌更像:

 gAAAAABaCo1F1CIMVlsTBeuqYH8tm2qR29tbkmUL4vZuhCNPXJI39TQ2YzL6Twoj8fNcAyLe3WhCYW2O1YpbBF0G8mo4bt7Kf0IRsoDOoJ6uWa3RYyJ5SQNoB_5n8EnVXbKPxFYOZ_iFBnaVtL1_XDrGbwsrlDeyy8lZTDdLsqY52pUhFR-7Uow

这不是我通过get_token 得到的。

我做错了什么?

非常感谢!

【问题讨论】:

    标签: python openstack


    【解决方案1】:

    当您直接使用身份验证 API 时,颁发的令牌来自 X-Subject-Token 标头。

    因此,要在您的 python 示例中检索,您可以像这样访问response.headers dict:

    token = r.headers['X-Subject-Token']
    

    Keystone v3 docs 中有关身份验证的更多信息

    【讨论】:

      【解决方案2】:
      1. fetch authentication token as mentioned below: 
       r = requests.post(
       OS_AUTH_URL+'/auth/tokens',
        headers = HEADERS,
        json    = data,     
        verify  = False
       )
       token = r.headers[X-Subject-Token] 
      
      2. Pass this token in header for further request:
       {
              'X-Auth-Token': token
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        相关资源
        最近更新 更多