diff options
author | adamscmRH <chadams@redhat.com> | 2018-06-01 22:17:15 +0200 |
---|---|---|
committer | adamscmRH <chadams@redhat.com> | 2018-06-04 16:57:18 +0200 |
commit | d885d0fe220ef8e10c81dddb64e2b54885087e61 (patch) | |
tree | 5ee217da0dc2eb53df762a7dae3470cccb841568 /docs/auth | |
parent | Merge pull request #2008 from rooftopcellist/default_scope (diff) | |
download | awx-d885d0fe220ef8e10c81dddb64e2b54885087e61.tar.xz awx-d885d0fe220ef8e10c81dddb64e2b54885087e61.zip |
updates oauth docs with quickstart
Diffstat (limited to 'docs/auth')
-rw-r--r-- | docs/auth/oauth.md | 111 |
1 files changed, 65 insertions, 46 deletions
diff --git a/docs/auth/oauth.md b/docs/auth/oauth.md index 799c25a503..3da2fa2c8f 100644 --- a/docs/auth/oauth.md +++ b/docs/auth/oauth.md @@ -6,7 +6,49 @@ the HTTP authentication header. The token can be scoped to have more restrictive the base RBAC permissions of the user. Refer to [RFC 6749](https://tools.ietf.org/html/rfc6749) for more details of OAuth 2 specification. -## Usage +## Basic Usage + +To get started using OAuth 2 tokens for accessing the browsable API using OAuth 2, we will walkthrough acquiring a token, and using it. + +1. Make an application with authorization_grant_type set to 'password'. HTTP POST the following to the `/api/v2/applications/` endpoint (supplying your own organization-id): +``` +{ + "name": "Admin Internal Application", + "description": "For use by secure services & clients. ", + "client_type": "confidential", + "redirect_uris": "", + "authorization_grant_type": "password", + "skip_authorization": false, + "organization": <organization-id> +} +``` +2. Make a token with a POST to the `/api/v2/tokens/` endpoint: +``` +{ + "description": "My Access Token", + "application": <application-id>, + "scope": "write" +} +``` +This will return a `<token-value>` that you can use to authenticate with for future requests (this will not be shown again) + +3. Use token to access a resource. We will use curl to demonstrate this: +``` +curl -H "Authorization: Bearer <token-value>" -X GET https://<awx>/api/v2/users/ +``` +> The `-k` flag may be needed if you have not set up a CA yet and are using SSL. + +This token can be revoked by making a DELETE on the detail page for that token. All you need is that token's id. For example: +``` +curl -ku <user>:<password> -X DELETE https://<awx>/api/v2/tokens/<pk>/ +``` + +Similarly, using a token: +``` +curl -H "Authorization: Bearer <token-value>" -X DELETE https://<awx>/api/v2/tokens/<pk>/ -k +``` + +## More Information #### Managing OAuth 2 applications and tokens Applications and tokens can be managed as a top-level resource at `/api/<version>/applications` and @@ -14,11 +56,11 @@ Applications and tokens can be managed as a top-level resource at `/api/<version `/api/<version>/users/N/<resource>`. Applications can be created by making a POST to either `api/<version>/applications` or `/api/<version>/users/N/applications`. -Each OAuth 2 application represents a specific API client on the server side. For an API client to use the API, -it must first have an application, and issue an access token. +Each OAuth 2 application represents a specific API client on the server side. For an API client to use the API via an application token, +it must first have an application and issue an access token. Individual applications will be accessible via their primary keys: -`/api/<version>/applications/<primary key of an application>/`. Here is a typical application: +`/api/<version>/applications/<pk>/`. Here is a typical application: ``` { "id": 1, @@ -59,10 +101,10 @@ Individual applications will be accessible via their primary keys: "skip_authorization": false }, ``` -In the above example, `user` is the primary key of the user this application associates to and `name` is +In the above example, `user` is the primary key of the user associated to this application and `name` is a human-readable identifier for the application. The other fields, like `client_id` and `redirect_uris`, are mainly used for OAuth 2 authorization, which will be covered later in the 'Using -OAuth token system' section. +OAuth 2 Token System' section. Fields `client_id` and `client_secret` are immutable identifiers of applications, and will be generated during creation; Fields `user` and `authorization_grant_type`, on the other hand, are @@ -85,7 +127,7 @@ token scope; or POSTing to `/api/v2/applications/<pk>/tokens/` by providing only the parent application will be automatically linked. Individual tokens will be accessible via their primary keys: -`/api/<version>/tokens/<primary key of a token>/`. Here is a typical token: +`/api/<version>/tokens/<pk>/`. Here is a typical token: ``` { "id": 4, @@ -123,7 +165,7 @@ Individual tokens will be accessible via their primary keys: For an OAuth 2 token, the only fully mutable fields are `scope` and `description`. The `application` field is *immutable on update*, and all other fields are totally immutable, and will be auto-populated during creation -* `user` field will be the `user` field of related application +* `user` field corresponds to the user the token is created for * `expires` will be generated according to Tower configuration setting `OAUTH2_PROVIDER` * `token` and `refresh_token` will be auto-generated to be non-clashing random strings. Both application tokens and personal access tokens will be shown at the `/api/v2/tokens/` @@ -134,26 +176,27 @@ On RBAC side: - System admin is able to see and manipulate every token in the system; - Organization admins will be able to see and manipulate all tokens belonging to Organization members; + System Auditors can see all tokens and applications - Other normal users will only be able to see and manipulate their own tokens. > Note: Users can only see the token or refresh-token _value_ at the time of creation ONLY. -#### Using OAuth 2 token system for Personal Access Tokens (PAT) +#### Using OAuth 2 Token System for Personal Access Tokens (PAT) The most common usage of OAuth 2 is authenticating users. The `token` field of a token is used as part of the HTTP authentication header, in the format `Authorization: Bearer <token field value>`. This _Bearer_ token can be obtained by doing a curl to the `/api/o/token/` endpoint. For example: ``` curl -ku <user>:<password> -H "Content-Type: application/json" -X POST \ -d '{"description":"Tower CLI", "application":null, "scope":"write"}' \ -https://localhost:8043/api/v2/users/1/personal_tokens/ | python -m json.tool +https://<awx>/api/v2/users/1/personal_tokens/ | python -m json.tool ``` Here is an example of using that PAT to access an API endpoint using `curl`: ``` -curl -H "Authorization: Bearer kqHqxfpHGRRBXLNCOXxT5Zt3tpJogn" http://localhost:8013/api/v2/credentials/ +curl -H "Authorization: Bearer kqHqxfpHGRRBXLNCOXxT5Zt3tpJogn" http://<awx>/api/v2/credentials/ ``` According to OAuth 2 specification, users should be able to acquire, revoke and refresh an access -token. In AWX the equivalent, and the easiest, way of doing that is creating a token, deleting -a token, and deleting a token quickly followed by creating a new one. +token. In AWX the equivalent, and easiest, way of doing that is creating a token, deleting +a token, and deleting a token quickly followed by creating a new one. The specification also provides standard ways of doing this. RFC 6749 elaborates on those topics, but in summary, an OAuth 2 token is officially acquired via authorization using @@ -166,6 +209,7 @@ In AWX, our OAuth 2 system is built on top of support on standard authorization, token revoke and refresh. AWX implements them and puts related endpoints under `/api/o/` endpoint. Detailed examples on the most typical usage of those endpoints are available as description text of `/api/o/`. See below for information on Application Access Token usage. +> Note: The `/api/o/` endpoints can only be used for application tokens, and are not valid for personal access tokens. #### Token scope mask over RBAC system The scope of an OAuth 2 token is a space-separated string composed of keywords like 'read' and 'write'. @@ -204,7 +248,7 @@ Make a POST to the `/api/v2/applications/` endpoint. "name": "AuthCodeApp", "user": 1, "client_type": "confidential", - "redirect_uris": "http://localhost:8013/api/v2", + "redirect_uris": "http://<awx>/api/v2", "authorization_grant_type": "authorization-code", "skip_authorization": false } @@ -237,7 +281,7 @@ Suppose we have an application `admin's app` of grant type `implicit`: "client_id": "L0uQQWW8pKX51hoqIRQGsuqmIdPi2AcXZ9EJRGmj", "client_secret": "9Wp4dUrUsigI8J15fQYJ3jn0MJHLkAjyw7ikBsABeWTNJbZwy7eB2Xro9ykYuuygerTPQ2gIF2DCTtN3kurkt0Me3AhanEw6peRNvNLs1NNfI4f53mhX8zo5JQX0BKy5", "client_type": "confidential", - "redirect_uris": "http://localhost:8013/api/", + "redirect_uris": "http://<awx>/api/", "authorization_grant_type": "implicit", "skip_authorization": false } @@ -293,7 +337,7 @@ curl -X POST \ -d "grant_type=password&username=<username>&password=<password>&scope=read" \ -u "gwSPoasWSdNkMDtBN3Hu2WYQpPWCO9SwUEsKK22l:fI6ZpfocHYBGfm1tP92r0yIgCyfRdDQt0Tos9L8a4fNsJjQQMwp9569e IaUBsaVDgt2eiwOGe0bg5m5vCSstClZmtdy359RVx2rQK5YlIWyPlrolpt2LEpVeKXWaiybo" \ - http://localhost:8013/api/o/token/ -i + http://<awx>/api/o/token/ -i ``` In the above post request, parameters `username` and `password` are username and password of the related AWX user of the underlying application, and the authentication information is of format @@ -340,7 +384,7 @@ The `/api/o/token/` endpoint is used for refreshing access token: curl -X POST \ -d "grant_type=refresh_token&refresh_token=AL0NK9TTpv0qp54dGbC4VUZtsZ9r8z" \ -u "gwSPoasWSdNkMDtBN3Hu2WYQpPWCO9SwUEsKK22l:fI6ZpfocHYBGfm1tP92r0yIgCyfRdDQt0Tos9L8a4fNsJjQQMwp9569eIaUBsaVDgt2eiwOGe0bg5m5vCSstClZmtdy359RVx2rQK5YlIWyPlrolpt2LEpVeKXWaiybo" \ - http://localhost:8013/api/o/token/ -i + http://<awx>/api/o/token/ -i ``` In the above post request, `refresh_token` is provided by `refresh_token` field of the access token above. The authentication information is of format `<client_id>:<client_secret>`, where `client_id` @@ -368,41 +412,16 @@ after, with information like scope and related application identical to the orig verify by checking the new token is present and the old token is deleted at the /api/v2/tokens/ endpoint. #### Revoke an access token -Revoking an access token is the same as deleting the token resource object. Suppose we have -an existing token to revoke: -```text -{ - "id": 30, - "type": "access_token", - "url": "/api/v2/tokens/30/", - ... - "user": null, - "token": "rQONsve372fQwuc2pn76k3IHDCYpi7", - "refresh_token": "", - "application": 6, - "expires": "2017-12-06T03:24:25.614523Z", - "scope": "read" -} -``` -Revoking is conducted by POSTing to `/api/o/revoke_token/` with the token to revoke as parameter: + +##### Alternatively Revoke using the /api/o/revoke-token/ endpoint +Revoking an access token by this method is the same as deleting the token resource object, but it allows you to delete a token by providing its token value, and the associated `client_id` (and `client_secret` if the application is `confidential`). For example: ```bash curl -X POST -d "token=rQONsve372fQwuc2pn76k3IHDCYpi7" \ -u "gwSPoasWSdNkMDtBN3Hu2WYQpPWCO9SwUEsKK22l:fI6ZpfocHYBGfm1tP92r0yIgCyfRdDQt0Tos9L8a4fNsJjQQMwp9569eIaUBsaVDgt2eiwOGe0bg5m5vCSstClZmtdy359RVx2rQK5YlIWyPlrolpt2LEpVeKXWaiybo" \ - http://localhost:8013/api/o/revoke_token/ -i + http://<awx>/api/o/revoke_token/ -i ``` `200 OK` means a successful delete. -```text -HTTP/1.1 200 OK -Server: nginx/1.12.2 -Date: Tue, 05 Dec 2017 18:05:18 GMT -Content-Type: text/html; charset=utf-8 -Content-Length: 0 -Connection: keep-alive -Vary: Accept-Language, Cookie -Content-Language: en -Strict-Transport-Security: max-age=15768000 -``` We can verify the effect by checking if the token is no longer present at /api/v2/tokens/. |