This page describes these Identity API v3 extensions:
Enables projects to inherit role assignments from either their owning domain or projects that are higher in the hierarchy.
The OS-INHERIT extension was extended in API v3.4 to allow inheritance from projects in addition to inheritance from domains. To access project inheritance, the Identity service server must run at least API v3.4.
The scope section in the list response is extended to allow the representation of role assignments that are inherited to projects.
The list of all role assignments can be long. To filter the list, use the query parameters.
Some typical examples are:
GET /role_assignments?user.id={user_id}
lists all role assignments for the specified
user.
GET
/role_assignments?scope.project.id={project_id}
lists all role assignments for the specified
project.
Each role assignment entity in the collection contains a link to the assignment that created this entity.
Use the effective
query parameter to list effective
assignments at the user, project, and domain level. This parameter
allows for the effects of group membership as well as inheritance
from the parent domain or project, for role assignments that were
made using OS-INHERIT assignment APIs.
The group role assignment entities themselves are not returned in
the collection. Because, like group membership, the effects of
inheritance have already been allowed for, the role assignment
entities themselves that specify the inheritance are not returned
in the collection. This represents the effective role assignments
that would be included in a scoped token. You can use the other
query parameters with the effective
parameter.
For example, to determine what a user can actually
do, issue this request: GET
/role_assignments?user.id={user_id}&effective
To return the equivalent set of role assignments
that would be included in the token response of a
project-scoped token, issue: GET
/role_assignments?user.id={user_id}&scope.project.id={project_id}&effective
In the response, the entity links
section for entities that are included by virtue of
group members also contains a url that you can use to
access the membership of the group.
An additional scope.OS-INHERIT:inherited_to query
filter enables filtering based on role assignments that are
inherited. The scope.OS-INHERIT:inherited_to
value of
projects
is currently supported. This value indicates
that this role is inherited to all projects of the owning domain
or parent project.
An example response for an API call with the query string effective specified follows:
Parameter | Style | Type | Description |
---|---|---|---|
group.id (Optional) | query | xsd:string |
Filters on group ID.
Specify |
role.id (Optional) | query | xsd:string |
Filters on role ID.
Specify |
scope.domain.id (Optional) | query | xsd:string |
Filters on domain ID.
Specify
|
scope.project.id (Optional) | query | xsd:string |
Filters on project ID.
Specify
|
user.id (Optional) | query | xsd:string |
Filters on user ID.
Specify |
effective (Optional) | query | xsd:key |
Lists effective assignments at the user, project, and domain level, allowing for the effects of group membership. The group role assignment entities themselves are not returned in the collection. This represents the effective role
assignments that would be included in a
scoped token. You can use the other query
parameters with the |
{ "role_assignments": [ { "links": { "assignment": "http://identity:35357/v3/OS-INHERIT/domains/1234/users/5678/roles/91011/inherited_to_projects" }, "role": { "id": "91011" }, "scope": { "domain": { "id": "1234" }, "OS-INHERIT:inherited_to": "projects" }, "user": { "id": "5678" } }, { "group": { "id": "5678" }, "links": { "assignment": "http://identity:35357/v3/projects/1234/groups/5678/roles/91011" }, "role": { "id": "91011" }, "scope": { "project": { "id": "1234" } } } ], "links": { "self": "http://identity:35357/v3/role_assignments", "previous": null, "next": null } }
{ "role_assignments": [ { "links": { "assignment": "http://identity:35357/v3/OS-INHERIT/domains/12131/users/41516/roles/91011/inherited_to_projects" }, "role": { "id": "91011" }, "scope": { "project": { "id": "1234" } }, "user": { "id": "41516" } }, { "links": { "assignment": "http://identity:35357/v3/projects/1234/groups/5678/roles/91011", "membership": "http://identity:35357/v3/groups/5678/users/41516" }, "role": { "id": "91011" }, "scope": { "project": { "id": "1234" } }, "user": { "id": "41516" } } ], "links": { "self": "http://identity:35357/v3/role_assignments?effective", "previous": null, "next": null } }
This operation does not accept a request body.
Lists the inherited project roles for a specified user on a specified project.
The list contains only those roles that are assigned to this project that were specified as being inherited to its subtree.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
user_id | URI | csapi:uuid |
The ID of the user. |
{ "roles": [ { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" }, { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" } ], "links": { "self": "http://identity:35357/v3/OS-INHERIT/projects/1234/users/5678/roles/inherited_to_projects", "previous": null, "next": null } }
This operation does not accept a request body.
Assigns a specified role to a specified user on projects in a subtree.
The inherited role assignment is anchored to a project and applied to its subtree in the projects hierarchy to both existing and future projects.
A user can have both a regular, non-inherited role assignment and an inherited role assignment on the same project.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
user_id | URI | csapi:uuid |
The ID of the user. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Checks whether a specified user has a specified role assignment with the
inherited_to_projects
flag on a specified
project.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
user_id | URI | csapi:uuid |
The ID of the user. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Revokes an inherited role from a specified user a specified project.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
user_id | URI | csapi:uuid |
The ID of the user. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Lists the inherited project roles for a specified group on a specified project.
The list contains only those roles that are assigned to this project that were specified as being inherited to its subtree.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
group_id | URI | csapi:uuid |
The ID of the group. |
{ "roles": [ { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" }, { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" } ], "links": { "self": "http://identity:35357/v3/OS-INHERIT/projects/1234/groups/5678/roles/inherited_to_projects", "previous": null, "next": null } }
This operation does not accept a request body.
Assigns a specified role to a specified group on projects in a subtree.
The inherited role assignment is anchored to a project and applied to its subtree in the projects hierarchy to both existing and future projects.
A group can have both a regular, non-inherited role assignment and an inherited role assignment on the same project.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
group_id | URI | csapi:uuid |
The ID of the group. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Checks whether a specified group has a specified role assignment with the
inherited_to_projects
flag on a specified
project.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
group_id | URI | csapi:uuid |
The ID of the group. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Revokes an inherited role from a specified group on a specified project.
Parameter | Style | Type | Description |
---|---|---|---|
project_id | URI | csapi:uuid | The ID of the project. |
group_id | URI | csapi:uuid |
The ID of the group. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Lists the inherited project roles on a specified domain for a specified user.
The list contains only those role assignments to the domain that were specified as being inherited to projects within that domain.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
user_id | URI | csapi:uuid |
The ID of the user. |
{ "roles": [ { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" }, { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" } ], "links": { "self": "http://identity:35357/v3/OS-INHERIT/domains/1234/users/5678/roles/inherited_to_projects", "previous": null, "next": null } }
This operation does not accept a request body.
Assigns a specified role to a specified user on projects owned by a specified domain.
The inherited role is applied to only the owned projects, both existing and future, and does not appear as a role in a domain-scoped token.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
user_id | URI | csapi:uuid |
The ID of the user. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Checks whether a specified user has an inherited project role on a specified domain.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
user_id | URI | csapi:uuid |
The ID of the user. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Revokes an inherited project role from a specified user on a specified domain.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
user_id | URI | csapi:uuid |
The ID of the user. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Lists the inherited project roles on a specified domain for a specified group.
The list contains only those role assignments to the domain that were specified as being inherited to projects within that domain.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
group_id | URI | csapi:uuid |
The ID of the group. |
{ "roles": [ { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" }, { "id": "91011", "links": { "self": "http://identity:35357/v3/roles/91011" }, "name": "admin" } ], "links": { "self": "http://identity:35357/v3/OS-INHERIT/domains/1234/groups/5678/roles/inherited_to_projects", "previous": null, "next": null } }
This operation does not accept a request body.
Assigns a specified role to a specified group on projects owned by a specified domain.
The inherited role is applied to only the owned projects, both existing and future, and does not appear as a role in a domain-scoped token.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
group_id | URI | csapi:uuid |
The ID of the group. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Checks whether a specified group has an inherited project role on a specified domain.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
group_id | URI | csapi:uuid |
The ID of the group. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
Revokes an inherited project role from a specified group on a specified domain.
Parameter | Style | Type | Description |
---|---|---|---|
domain_id | URI | csapi:uuid | The ID of the domain. |
group_id | URI | csapi:uuid |
The ID of the group. |
role_id | URI | csapi:uuid |
The ID of the role. |
This operation does not accept a request body and does not return a response body.
The Key Distribution Server (KDS) is a trusted third party that generates and securely distributes signing and encryption keys to communicating parties. These shared keys enable parties to exchange authenticated, confidential messages. KDS is an integral part of the RPC message security implementation. To establish a trusted relationship between the party and the KDS, a properly authorized user, such as a cloud administrator, must assign a long-term shared key to the communicating party. Assigning a key to a party requires assigning an identity to that party in the KDS. An identity includes a unique party name and the associated long-term shared key. This party name is used to identify a party when it communicates with KDS or another party.
The KDS enables two individual parties or one individual party and a group party to exchange secure messages. To get keys so that it can communicate with another party, a party makes an authenticated request to KDS for a ticket. The KDS returns an encrypted ticket to the requesting party. The KDS encrypts the ticket with the long-term shared key that is associated with that party. Only the associated party or the KDS itself can decrypt the ticket.
The KDS issues a ticket that contains a copy of the shared encryption and signing keys. These keys are for the source party, which is the party that requests the ticket. The ticket also contains a payload that is intended for the destination party, which is the party with whom the source party wants to communicate. This payload contains the information that the destination party can use to derive the shared encryption and signing keys. When the destination party is:
An individual. The payload is encrypted with the long-term shared key that is associated with the destination party.
A group. The payload is encrypted with a shared group key that the KDS makes available to all members of the group. This encryption enables the destination party to trust that the information in the payload was supplied by the KDS.
When the source party is ready to communicate with the destination party, it sends this encrypted payload to the destination party along with whatever data it has protected with the shared signing and encryption keys. The destination party can decrypt the payload and derive the shared encryption and signing keys by using the payload information. Both parties have a copy of the shared signing and encryption keys that are trusted as being issued by the KDS. The destination party uses these shared keys to authenticate and decrypt the data sent by the source party.
Other guidelines:
When a source party must send secure messages to multiple
recipients, an authorized user can define a KDS group for the
recipients. Membership in a group is determined by comparing a
party name with the group name. The party is considered to be a
member if the party name matches <group name>.*
.
For example, a party named scheduler.host.example.com
is considered a member of the scheduler
group. This
method is the same method that is used to name message queues in
OpenStack.
When a source party requests a ticket for a destination party that is a group, KDS generates a short-lived group key and assigns it to the group. This group key is used to encrypt the payload in the ticket, which contains the information that the destination party uses to derive the shared signing and encryption keys.
When an individual destination party must decrypt the payload that it receives from the source party as a part of a group message, it makes an authenticated request to KDS to get the short-lived group key. If the requester is a member of the target group, KDS provides the short-lived group key encrypted with the long-term shared key associated with the individual destination party. The individual destination party can then decrypt the group key, which enables it to decrypt the payload and derive the shared signing and encryption keys to use to authenticate and decrypt the data sent by the source party.
When a sender gets keys to send a message to a group, all group members and the sender share the signing and encryption keys, which makes it impossible for an individual destination party to determine whether a message was sent by the source party or by another destination party who is a group member. The destination party can confirm only that the message was sent by a party who has the shared signing and encryption keys. When a sender uses keys to send a message to a group, all group members must trust other members to operate in good faith.
The signing and encryption keys that communicating parties share are short-lived. The life span of these keys is defined by a validity period that is set by the KDS when it issues the ticket. A suggested reasonable default validity period is 15 minutes, though the implementation determines the appropriate validity period.
After the validity period for the keys expires, a party should refuse to use those keys to prevent the use of compromised keys. This requires the source party to request a new ticket from the KDS to get a new set of keys. An implementation can implement a grace period to account for clock skew between parties. This grace period enables a destination party to accept messages that use recently expired keys. If you use a grace period, its duration should be five or fewer minutes.
A key server, unlike a pure public key-based system, can regulate the encryption and signing key exchange. When keys are requested, the key server actively distributes keys to communicating parties, applies access control, and denies communication between arbitrary peers in the system. This enables centralized access control, prevents unauthorized communication, and eliminates the need to perform post-authentication access control and policy lookups on the receiving side.
The KDS requires that all ticket requests are authenticated and
data is encrypted where appropriate. You must specify all
timestamp values that are used in the API as a UTC ISO 8601
extended format date and time string that includes microseconds.
For example, 2012-03-26T10:01:01.720000
.
The default algorithms for message authentication and encryption are, respectively, HMAC-SHA-256 and AES-128-CBC. Therefore, the default block size is 128bit.
The source party that requests a ticket must send the encrypted
esek
payload to the destination party. The source and
destination strings used when requesting the ticket also must be
sent to the destination party to enable it to derive the shared
signing end encryption keys. The messaging implementation is
responsible for transferring this data to the destination party.
The key derivation used to generate the shared signing and
encryption keys uses the Hashed Message Authentication Code
(HMAC)-based key derivation function (HKDF) standard, as
described in RFC 5869. The destination party must use the HKDF
expand
function by using the information that it
receives from the source party to complete derivation of the
shared signing and encryption keys. The inputs to the HKDF
expand
function are:
HKDF-Expand(esek.key, info, 256)
The info
input for the HKDF expand
function is a string that concatenates the source,
destination, and esek.timestamp
strings by using
a comma (,
) separator between each element. An
example of a valid info
string where
scheduler.host.example.com
is the source,
compute.host.example.com
is the destination, and
2012-03-26T10:01:01.720000
is the
esek.timestamp
is:
scheduler.host.example.com,compute.host.example.com,2012-03-26T10:01:01.720000
The output of the HKDF expand function is an array of bytes of 256 bit length. The first half is the signing key, and the second half is the encryption key.
Create and delete requests for long-term keys are restricted to authorized users, such as cloud administrators. The authentication and authorization for these requests is left up to the implementation, though the implementation should leverage the Identity API for these purposes.
The request body contains the key.
The response shows the key name and generation value.
Parameter | Style | Type | Description |
---|---|---|---|
name | URI | csapi:string |
The name of the party that is associated with the key. |
Parameter | Style | Type | Description |
---|---|---|---|
name | plain | xsd:string |
The name of the party that is associated with the key. |
generation | plain | xsd:int |
A unique integer value that identifies the key. The generation value changes only if you set a new key. If the request sets the key to the same value that already exists, the response shows the existing generation value, which makes the request idempotent. |
{ "key": "TXkgcHJlY2lvdXNzcy4u..." }
{ "name": "TXkgcHJlY2lvdXNzcy4u...", "generation": 2 }
Parameter | Style | Type | Description |
---|---|---|---|
name | URI | csapi:string |
The name of the party that is associated with the key. |
This operation does not accept a request body and does not return a response body.
Generates a ticket to facilitate messaging between a source and destination.
A generate ticket request contains metadata that you specify as a base64-encoded JSON object and a signature.
The response shows the metadata, encrypted ticket, and signature.
Parameter | Style | Type | Description |
---|---|---|---|
metadata | plain | xsd:string |
A base64-encoded JSON object that contains these key and value pairs:
The timestamp and nonce are required to prevent replay attacks. For example: { "source": "scheduler.host.example.com", "destination": "compute.host.example.com", "timestamp": "2012-03-26T10:01:01.720000", "nonce": 1234567890 } |
signature | plain | xsd:string |
A base64-encoded HMAC signature over the base64-encoded request metadata object. For example:
The long-term key of the requester is used for the
signature. When the request is received, the KDS
must verify the signature. To do so, the KDS must
access the |
generation | plain | xsd:int |
A unique integer value that identifies the key. The generation value changes only if you set a new key. If the request sets the key to the same value that already exists, the response shows the existing generation value, which makes the request idempotent. |
Parameter | Style | Type | Description |
---|---|---|---|
metadata | plain | xsd:string |
A base64-encoded JSON object that contains these key and value pairs:
The timestamp and nonce are required to prevent replay attacks. For example: { "source": "scheduler.host.example.com", "destination": "compute.host.example.com", "timestamp": "2012-03-26T10:01:01.720000", "nonce": 1234567890 } |
ticket | plain | xsd:string |
The ticket is encrypted with the long-term key of the source and contains a base64-encoded JSON object containing the following key and value pairs:
For example: { "skey": "ZjhkuYZH8y87rzhgi7...", "ekey": "Fk8yksa8z8zKtakc8s...", "esek": "KBo8fajfo8ysad5hq2..." }
The long-term key of the destination is used to
encrypt the
For example: { "key": "Afa8sad2hgsd7asv7ad...", "timestamp": "2012-03-26T10:01:01.720000", "ttl": 28800 }
The
The |
signature | plain | xsd:string |
A base64-encoded HMAC signature over the base64-encoded request metadata object. For example:
The long-term key of the requester is used for the
signature. When the KDS receives the request, the KDS
must access the |
{ "metadata": "Zhn8yhasf8hihkf...", "signature": "c2lnbmF0dXJl..." }
{ "source": "scheduler.host.example.com", "destination": "compute.host.example.com", "timestamp": "2012-03-26T10:01:01.720000", "nonce": 1234567890 }
When a ticket is requested where the destination is a group, a group key is generated that is valid for a predetermined amount of time. Any member of the group can get the key as long as it is still valid. Group keys are necessary to verify signatures and decrypt messages that have a group name as the target.
Parameter | Style | Type | Description |
---|---|---|---|
name | plain | xsd:string |
The name of the group. |
{ "name": "--group-name--" }
This operation does not accept a request body.
Membership in groups is based on the party name. For example,
a scheduler
group implicitly includes any party
name that starts with scheduler
. For example, a
member named scheduler.host.example.com
.
Parameter | Style | Type | Description |
---|---|---|---|
name | URI | csapi:string |
The name of the group. |
Parameter | Style | Type | Description |
---|---|---|---|
name | plain | xsd:string |
The name of the group. |
{ "name": "--group-name--" }
This operation does not accept a request body.
Enables users to delegate roles to third-party consumers through the The OAuth 1.0 Protocol.
A user is an Identity API user who delegates its roles and who authorizes request tokens. A consumer is a third-party application that uses OAuth to access a protected resource. An OAuth-derived token enables admin users to act on behalf of the authorizing user. A request token is a token that the consumer uses to get authorization from the user and exchanges with an OAuth verifier for an access token. The OAuth verifier is a required string that is provided with the corresponding request token in exchange for an access token. An access token is a token that the consumer uses to request Identity API tokens on behalf of the authorizing user instead of using the credentials for the user.
Request and access tokens use token keys to identify themselves. For OpenStack purposes, the token key is the token ID. The consumer uses a token secret to establish ownership of a specified token. Both request and access tokens have token secrets.
Delegated authentication through OAuth occurs as follows:
A user creates a consumer.
The consumer gets an unauthorized request token. Then, the consumer uses the request token to initiate user authorization.
The user authorizes the request token.
The consumer exchanges the authorized request token and the OAuth verifier for an access token.
The authorizing user receives the request token key from the consumer out-of-band.
The consumer uses the access token to request an Identity API token.
Parameter | Style | Type | Description |
---|---|---|---|
secret | plain | xsd:string |
A secret for the consumer, which is returned only when the consumer is created. |
description (Optional) | plain | xsd:string |
The consumer description. |
id | plain | csapi:uuid |
The ID of the consumer. In OpenStack, the ID is the key. |
links | plain | xsd:dict |
Consumer links. |
{ "consumer": { "description": "My consumer" } }
{ "consumer": { "secret": "secretsecret", "description": "My consumer", "id": "7fea2d", "links": { "self": "http://identity:35357/v3/OS-OAUTH1/consumers/7fea2d" } } }
Parameter | Style | Type | Description |
---|---|---|---|
description (Optional) | plain | xsd:string |
The consumer description. |
id | plain | csapi:uuid |
The ID of the consumer. In OpenStack, the ID is the key. |
links | plain | xsd:dict |
Consumer links. |
next (Optional) | plain | xsd:anyURI |
Moves to the next item in the list. |
previous (Optional) | plain | xsd:anyURI |
Moves to the previous item in the list. |
{ "consumers": [ { "id": "0c2a74", "links": { "self": "http://identity:35357/v3/OS-OAUTH1/consumers/0c2a74" } }, { "description": "My consumer", "id": "7fea2d", "links": { "self": "http://identity:35357/v3/OS-OAUTH1/consumers/7fea2d" } } ], "links": { "next": null, "previous": null, "self": "http://identity:35357/v3/OS-OAUTH1/consumers" } }
This operation does not accept a request body.
Shows information for a specified consumer.
Parameter | Style | Type | Description |
---|---|---|---|
consumer_id | URI | csapi:uuid | The ID of the consumer. |
Parameter | Style | Type | Description |
---|---|---|---|
id | plain | csapi:uuid |
The ID of the consumer. In OpenStack, the ID is the key. |
description (Optional) | plain | xsd:string |
The consumer description. |
links | plain | xsd:dict |
Consumer links. |
{ "consumer": { "id": "7fea2d", "description": "My consumer", "links": { "self": "http://identity:35357/v3/OS-OAUTH1/consumers/7fea2d" } } }
This operation does not accept a request body.
Updates the description for a specified consumer.
If you try to update any attribute other than description, the HTTP 400 Bad Request error is returned.
Parameter | Style | Type | Description |
---|---|---|---|
consumer_id | URI | csapi:uuid | The ID of the consumer. |
Parameter | Style | Type | Description |
---|---|---|---|
description (Optional) | plain | xsd:string |
The consumer description. |
id | plain | csapi:uuid |
The ID of the consumer. In OpenStack, the ID is the key. |
links | plain | xsd:dict |
Consumer links. |
{ "consumer": { "description": "My new consumer" } }
{ "consumer": { "description": "My new consumer", "id": "7fea2d", "links": { "self": "http://identity:35357/v3/OS-OAUTH1/consumers/7fea2d" } } }
When you delete a consumer, any associated request tokens, access tokens, and Identity API tokens are also deleted.
Parameter | Style | Type | Description |
---|---|---|---|
consumer_id | URI | csapi:uuid | The ID of the consumer. |
This operation does not accept a request body and does not return a response body.
Enables a consumer to get an unauthorized request token.
Supported signature methods: HMAC-SHA1.
The consumer must provide all required OAuth parameters in the request. See Consumer Obtains a Request Token.
Parameter | Style | Type | Description |
---|---|---|---|
oauth_token | plain | xsd:dict |
The request token key that the Identity API returns. |
oauth_token_secret | plain | xsd:dict |
The secret associated with the request token. |
oauth_expires_at (Optional) | plain | xsd:dict |
The ISO 8601 date time when a request token expires. If the Identity API does not include this attribute or the attribute is null, the token lasts indefinitely. |
oauth_token=29971f&oauth_token_secret=238eb8&oauth_expires_at=2013-09-11T06:07:51.501805Z
Enables a consumer to create an access token by exchanging a request token for an access token.
After the user authorizes the request token, the consumer exchanges the authorized request token and OAuth verifier for an access token.
Supported signature methods: HMAC-SHA1.
The consumer must provide all required OAuth parameters in the request. See Consumer Obtains a Request Token.
Supported signature methods: HMAC-SHA1.
You must provide all required OAuth parameters in the request. See Consumer Obtains a Request Token.
Parameter | Style | Type | Description |
---|---|---|---|
oauth_expires_at (Optional) | plain | xsd:dict |
The ISO 8601 date time when a request token expires. If the Identity Service API does not include this attribute or the attribute is null, the token lasts indefinitely. |
oauth_token | plain | xsd:dict |
The request token key that the Identity Service returns. |
oauth_token_secret | plain | xsd:dict |
The secret associated with the request token. |
oauth_token=accd36&oauth_token_secret=aa47da&oauth_expires_at=2013-09-11T06:07:51.501805Z
Lists authorized access tokens.
Parameter | Style | Type | Description |
---|---|---|---|
user_id | URI | csapi:uuid |
The ID of the user. |
Parameter | Style | Type | Description |
---|---|---|---|
consumer_id | URI | csapi:uuid |
The ID of the consumer. |
id | plain | csapi:uuid |
The ID for the access token. |
expires_at (Optional) | plain | xsd:dict |
The ISO 8601 date time when an access token expires. If the Identity Service API does not include this attribute or the attribute is null, the token lasts indefinitely. |
links | plain | xsd:dict |
Access token links. |
project_id | plain | csapi:uuid |
The ID of the project. |
authorizing_user_id | plain | csapi:uuid |
The ID of the authorizing user. |
{ "access_tokens": [ { "consumer_id": "7fea2d", "id": "6be26a", "expires_at": "2013-09-11T06:07:51.501805Z", "links": { "roles": "http://identity:35357/v3/users/ce9e07/OS-OAUTH1/access_tokens/6be26a/roles", "self": "http://identity:35357/v3/users/ce9e07/OS-OAUTH1/access_tokens/6be26a" }, "project_id": "b9fca3", "authorizing_user_id": "ce9e07" } ], "links": { "next": null, "previous": null, "self": "http://identity:35357/v3/users/ce9e07/OS-OAUTH1/access_tokens" } }
This operation does not accept a request body.
Gets an authorized access token.
Parameter | Style | Type | Description |
---|---|---|---|
user_id | URI | csapi:uuid |
The ID of the user. |
access_token_id | URI | csapi:uuid |
The ID of the access token. |
Parameter | Style | Type | Description |
---|---|---|---|
consumer_id | URI | csapi:uuid |
The ID of the consumer. |
id | plain | csapi:uuid |
The ID for the access token. |
expires_at (Optional) | plain | xsd:dict |
The ISO 8601 date time when an access token expires. If the Identity Service API does not include this attribute or the attribute is null, the token lasts indefinitely. |
links | plain | xsd:dict |
Access token links. |
project_id | plain | csapi:uuid |
The ID of the project. |
authorizing_user_id | plain | csapi:uuid |
The ID of the authorizing user. |
{ "access_token": { "consumer_id": "7fea2d", "id": "6be26a", "expires_at": "2013-09-11T06:07:51.501805Z", "links": { "roles": "http://identity:35357/v3/users/ce9e07/OS-OAUTH1/access_tokens/6be26a/roles", "self": "http://identity:35357/v3/users/ce9e07/OS-OAUTH1/access_tokens/6be26a" }, "project_id": "b9fca3", "authorizing_user_id": "ce9e07" } }
This operation does not accept a request body.
Enables a user to revoke an access token, which prevents the consumer from requesting new Identity Service API tokens. Also, revokes any Identity Service API tokens that were issued to the consumer through that access token.
Parameter | Style | Type | Description |
---|---|---|---|
user_id | URI | csapi:uuid |
The ID of the user. |
access_token_id | URI | csapi:uuid |
The ID of the access token. |
This operation does not accept a request body and does not return a response body.
Lists associated roles for a specified access token.
Parameter | Style | Type | Description |
---|---|---|---|
user_id | URI | csapi:uuid |
The ID of the user. |
access_token_id | URI | csapi:uuid |
The ID of the access token. |
This operation does not accept a request body and does not return a response body.
Gets information about a specified role for a specified access token.
Parameter | Style | Type | Description |
---|---|---|---|
user_id | URI | csapi:uuid |
The ID of the user. |
access_token_id | URI | csapi:uuid |
The ID of the access token. |
role_id | URI | csapi:uuid |
The ID of the role. |
Parameter | Style | Type | Description |
---|---|---|---|
id | plain | csapi:uuid |
The role ID. |
links | plain | xsd:dict |
Links to roles. |
name | plain | xsd:string |
The role name. |
This operation does not accept a request body.
Enables a consumer to get an Identity Service authentication token.
The token represents the delegated authorization and identity (impersonation) of the authorizing user. The roles and scope of the generated token match those that the consumer initially requested.
Supported signature methods: HMAC-SHA1.
The consumer must provide required OAuth parameters in the request. See Consumer Obtains a Request Token.
The returned token is scoped to the requested project and with the requested roles. In addition to the standard token response, the token has an OAuth-specific object.
Example OAuth-specific object in a token:
"OS-OAUTH1": { "access_token_id": "cce0b8be7" }
Creates a trust.
A trust is an OpenStack Identity extension that enables delegation
and, optionally, impersonation through keystone
. A
trust extension defines a relationship between a trustor and
trustee. A trustor is the user who delegates a limited set of
their own rights to another user. A trustee is the user whose
trust is being delegated to, for a limited time.
The trust can eventually enable the trustee to impersonate the trustor. For security reasons, some safety measures are added. For example, if a trustor loses a given role, any trusts and the related tokens that the user issued with that role are automatically revoked.
For more information, see Use trusts.
Parameter | Style | Type | Description |
---|---|---|---|
trust | plain | xsd:string |
A trust object. |
expires_at (Optional) | plain | xsd:dict |
The ISO 8601 date time when a trust expires. If the Identity API does not include this attribute or the attribute is null, the trust lasts indefinitely. |
impersonation (Optional) | plain | xsd:boolean |
The impersonation flag. Default is false. |
project_id | plain | csapi:uuid |
The ID of the project. |
remaining_uses (Optional) | plain | xsd:boolean |
Remaining uses flag. Default is null. |
roles | plain | xsd:dict |
A roles object. |
name | plain | xsd:string |
The role name. |
trustee_user_id | plain | xsd:string |
The trustee user ID. |
trustor_user_id | plain | xsd:string |
The trustor user ID. |
Parameter | Style | Type | Description |
---|---|---|---|
trust | plain | xsd:string |
A trust object. |
expires_at (Optional) | plain | xsd:dict |
The ISO 8601 date time when a trust expires. If you omit this attribute, the trust lasts indefinitely. |
id | plain | csapi:uuid |
The ID of the trust. |
impersonation | plain | xsd:boolean |
The impersonation flag. |
links | plain | xsd:dict |
Trust links. |
project_id | plain | csapi:uuid |
The ID of the project. |
remaining_uses | plain | xsd:boolean |
Remaining uses flag. |
roles | plain | xsd:dict |
A roles object. Includes |
roles_links | plain | xsd:dict |
A roles links object. Includes |
trustee_user_id | plain | xsd:string |
The trustee user ID. |
trustor_user_id | plain | xsd:string |
The trustor user ID. |
{ "trust": { "expires_at": "2014-12-30T23:59:59.999999Z", "impersonation": false, "project_id": "'$PROJECT_ID'", "roles": [ { "name": "admin" } ], "trustee_user_id": "'$DEMO_USER_ID'", "trustor_user_id": "'$ADMIN_USER_ID'" } }
{ "trust": { "expires_at": "2014-12-30T23:59:59.999999Z", "id": "394998fa61f14736b1f0c1f322882949", "impersonation": false, "links": { "self": "http://localhost:5000/v3/OS-TRUST/trusts/394998fa61f14736b1f0c1f322882949" }, "project_id": "3d4c2c82bd5948f0bcab0cf3a7c9b48c", "remaining_uses": null, "roles": [ { "id": "c703057be878458588961ce9a0ce686b", "links": { "self": "http://localhost:5000/v3/roles/c703057be878458588961ce9a0ce686b" }, "name": "admin" } ], "roles_links": { "next": null, "previous": null, "self": "http: //localhost:5000/v3/OS-TRUST/trusts/394998fa61f14736b1f0c1f322882949/roles" }, "trustee_user_id": "269348fdd9374b8885da1418e0730af1", "trustor_user_id": "3ec3164f750146be97f21559ee4d9c51" } }