openstack身份认证与API请求流程

一、概况

1. 请求认证token时,需发送的认证信息包括:

2. 如果认证成功,会获得认证token

3. 在发送的API请求中将认证token填入X-Auth-Token字段。可以一直使用这个认证token发送API请求,直到任务完成或出现401非认证错误。

4. 如果出现401非认证错误,可以重新请求一个认证token。

二、详细流程举例

说明:以下例子会使用到cURL( http://curl.haxx.se/)和OpenStack APIs( http://developer.openstack.org/api-ref.html)

1、认证过程

使用如下命令请求认证token:

$ curl -i ‘http://127.0.0.1:5000/v2.0/tokens‘ -X POST -H "Content-Type: application/json" -H "Accept: application/json"  -d ‘{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "secretsecret"}}}‘

如果认证成功,将获得200 OK响应报文,其中响应body包含了一个token和过期时间,前者格式为"id":"token",后者格式为"expires":"datetime"。详细情况如下:

HTTP/1.1 200 OK
Vary: X-Auth-Token
Content-Type: application/json
Content-Length: 5858
Date: Wed, 06 Nov 2013 20:06:24 GMT
{
    "access": {
        "token": {
            "issued_at": "2013-11-06T20:06:24.113908",
            "expires": "2013-11-07T20:06:24Z",
            "id": "{token}",
            "tenant": {
                "description": null,
                "enabled": true,
                "id": "604bbe45ac7143a79e14f3158df67091",
                "name": "admin"
            }
        },
        "serviceCatalog": [
            {
                "endpoints": [
                    {
                        "adminURL": "http://166.78.21.23:8774/v2/604bbe45ac7143a79e14f3158df67091",
                        "region": "RegionOne",
                        "internalURL": "http://166.78.21.23:8774/v2/604bbe45ac7143a79e14f3158df67091",
                        "id": "9851cb538ce04283b770820acc24e898",
                        "publicURL": "http://166.78.21.23:8774/v2/604bbe45ac7143a79e14f3158df67091"
                    }
                ],
                "endpoints_links": [],
                "type": "compute",
                "name": "nova"
            },
            {
                "endpoints": [
                    {
                        "adminURL": "http://166.78.21.23:3333",
                        "region": "RegionOne",
                        "internalURL": "http://166.78.21.23:3333",
                        "id": "0bee9a113d294dda86fc23ac22dce1e3",
                        "publicURL": "http://166.78.21.23:3333"
                    }
                ],
                "endpoints_links": [],
                "type": "s3",
                "name": "s3"
            },
            {
                "endpoints": [
                    {
                        "adminURL": "http://166.78.21.23:9292",
                        "region": "RegionOne",
                        "internalURL": "http://166.78.21.23:9292",
                        "id": "4b6e9ece7e25479a8f7bb07eb58845af",
                        "publicURL": "http://166.78.21.23:9292"
                    }
                ],
                "endpoints_links": [],
                "type": "image",
                "name": "glance"
            },
            {
                "endpoints": [
                    {
                        "adminURL": "http://166.78.21.23:8776/v1/604bbe45ac7143a79e14f3158df67091",
                        "region": "RegionOne",
                        "internalURL": "http://166.78.21.23:8776/v1/604bbe45ac7143a79e14f3158df67091",
                        "id": "221a2df63537400e929c0ce7184c5d68",
                        "publicURL": "http://166.78.21.23:8776/v1/604bbe45ac7143a79e14f3158df67091"
                    }
                ],
                "endpoints_links": [],
                "type": "volume",
                "name": "cinder"
            },
            {
                "endpoints": [
                    {
                        "adminURL": "http://166.78.21.23:8773/services/Admin",
                        "region": "RegionOne",
                        "internalURL": "http://166.78.21.23:8773/services/Cloud",
                        "id": "356f334fdb7045f7a35b0eebe26fca53",
                        "publicURL": "http://166.78.21.23:8773/services/Cloud"
                    }
                ],
                "endpoints_links": [],
                "type": "ec2",
                "name": "ec2"
            },
            {
                "endpoints": [
                    {
                        "adminURL": "http://166.78.21.23:35357/v2.0",
                        "region": "RegionOne",
                        "internalURL": "http://166.78.21.23:5000/v2.0",
                        "id": "10f3816574c14a5eb3d455b8a72dc9b0",
                        "publicURL": "http://166.78.21.23:5000/v2.0"
                    }
                ],
                "endpoints_links": [],
                "type": "identity",
                "name": "keystone"
            }
        ],
        "user": {
            "username": "admin",
            "roles_links": [],
            "id": "3273a50d6cfb4a2ebc75e83cb86e1554",
            "roles": [
                {
                    "name": "admin"
                }
            ],
            "name": "admin"
        },
        "metadata": {
            "is_admin": 0,
            "roles": [
                "b0d525aa42784ee0a3df1730aabdcecd"
            ]
        }
    }
}

2、发送API请求过程

说明:以下使用 Identity API (http://developer.openstack.org/api-ref-identity-v3.html)和Compute API (http://developer.openstack.org/api-ref-compute-v2.html)的请求举例。

2.1 使用Identity API 请求tenants list,如下:

$ curl -i -X GET http://166.78.21.23:35357/v2.0/tenants -H "User-Agent: python-keystoneclient" -H "X-Auth-Token: token"
结果内容:{
    "tenants_links": [],
    "tenants": [
        {
            "description": null,
            "enabled": true,
            "id": "3eddf34c2f814bd5bc50a382f8fba1c6",
            "name": "demo"
        },
        {
            "description": null,
            "enabled": true,
            "id": "604bbe45ac7143a79e14f3158df67091",
            "name": "admin"
        },
        {
            "description": null,
            "enabled": true,
            "id": "78323d3574e6421b98fe5894475c69fe",
            "name": "service"
        },
        {
            "description": null,
            "enabled": true,
            "id": "da73856734d84ec29958b048d8708d82",
            "name": "invisible_to_admin"
        },
        {
            "description": null,
            "enabled": true,
            "id": "ee30a93eaade41acbcf210780dd7a0ba",
            "name": "alt_demo"
        }
    ]
}

2.2 使用Compute API 请求servers list,如下:

$ curl -v -H "X-Auth-Token:token" http://208.123.85.197:8774/v2/tenant_id/servers
结果内容:{
    "server": {
        "adminPass": "MVk5HPrazHcG",
        "id": "5bbcc3c4-1da2-4437-a48a-66f15b1b13f9",
        "links": [
            {
                "href": "http://openstack.example.com/v2/openstack/servers/5bbcc3c4-1da2-4437-a48a-66f15b1b13f9",
                "rel": "self"
            },
            {
                "href": "http://openstack.example.com/openstack/servers/5bbcc3c4-1da2-4437-a48a-66f15b1b13f9",
                "rel": "bookmark"
            }
        ]
    }
}

三、详细流程图

如果给出tenant直接从以下步骤开始:

参考文章:

http://docs.openstack.org/api/quick-start/content/index.html#authenticate

http://docs.openstack.org/icehouse/install-guide/install/yum/content/keystone-concepts.html

时间: 2024-10-04 00:05:02

openstack身份认证与API请求流程的相关文章

RESTful框架的API请求流程

请看图!! 这个url表明在views这个视图下找到Class PublishView,再在这个类下面找到这个as_view()函数,返回一个函数名.当被调用的时候,执行这个函数. 但是我们可以看见这里面没有as_view()这个函数,所以往它的父类中寻找. 我们好不容易找到了,那我们来看看这里面到底返回了什么! 这里面又看到了,APIview这类往API这个父类中去执行,as_view()这个函数! (他到底要干啊!不妨我们在点进去看看) 这里面这个self有点意思,这个self指的是APIv

【React全家桶入门之十】登录与身份认证

仔细想想,我们的后台系统还没有一个登录功能,太不靠谱,赶紧把防盗门安上! SPA的鉴权方式和传统的web应用不同:由于页面的渲染不再依赖服务端,与服务端的交互都通过接口来完成,而REASTful风格的接口提倡无状态(state less),通常不使用cookie和session来进行身份认证. 比较流行的一种方式是使用web token,所谓的token可以看作是一个标识身份的令牌.客户端在登录成功后可以获得服务端加密后的token,然后在后续需要身份认证的接口请求中在header中带上这个to

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

api接口对于客户端的身份认证方式以及安全措施

转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key

RESTful Api 身份认证安全性设计

REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 HTTP 请求的 Method  之中. 详情可以阅读 http://mengkang.net/620.html . 而这篇文章则主要是讨论 RESTful Api 身份认证安全性设计. 没有绝对的安全,这个话题很深, 下文都是自己的一些理解,水平有限,如有勘误,希望大家予以指正. 由于 RESTfu

基于oauth授权框架其中获取令牌需要发送Http身份认证的请求

1.首先我们基于curl的请求参数示例: curl http://localhost:8080/oauth/token -X POST -u client:fucksecurity -d "grant_type=refresh_token&refresh_token=1a1fb46e-8ab4-4a3b-84c4-e70892eaa570"其中的 -u 表示的是身份认证的用户名和密码.后来尝试过Jquery的$.ajax的username和password去传这个两个对象,发现

身份认证流程描述

1.1.1          身份认证 每个用户都持有可唯一标识用户身份的私钥和由CA签发的公钥证书,用户私有信息保存在电子钥匙(USBKEY)或其它安全载体中.在访问应用系统时,用户出示自已的身份证明(签名和证书),实现基于证书的身份认证过程. 身份认证分为单向或双向认证方式,在一般情况下采用服务器认证客户的单向认证方式,在必要时可采用双向认证方式. 应用系统中,应用服务程序直接通过安全接口调用认证服务器对用户进行身份认证,用户身份信息由应用系统自身进行维护和管理. 应用系统服务器端和客户端各

Net Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程

原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> (本文很长) 摘要:本文主要介绍了使用外部登陆提供程序登陆的流程,以及身份认证的流程. 为了能够使用google.facebook.twitter.微博等外部登陆提供程序,从而避免创建本地账户以及电子邮件验证等繁琐步骤,我们一般会引用到外部登陆服务,将验证用户身份的任务委托给他们.外部验证最为流行的协议就是OAuth2和OpenId Connect. 在Asp.Net

关于ASP.Net Core Web及API身份认证的解决方案

6月15日,在端午节前的最后一个工作日,想起有段日子没有写过文章了,倒有些荒疏了.今借夏日蒸蒸之气,偷得浮生半日悠闲.闲话就说到这里吧,提前祝大家端午愉快(屈原听了该不高兴了:))!.NetCore自发布以来,颇受关注,现在.Net Core2.0已经正式发布,边迫不及待的将.Net跨平台移植的工作进行到底.想来,也费不了多少事儿.我经常和同事们说,要敢于尝试新鲜事物,不阴损守旧,方能使自己不断进步,站在队伍的前列.下面就关于Asp.Net Core在Web 及API项目上身份认证的问题做下简单