From 00bb76f35b4d21d0aaddb23f93d663ec02faea1a Mon Sep 17 00:00:00 2001 From: Josh Hawn Date: Mon, 24 Feb 2014 13:28:49 -0800 Subject: [PATCH] Added documentation for docker.io OAuth & Accounts OAuth docs: documented the OAuth authorization flow and how to register your application Account docs: documented getting/updating user profile data documented getting/updating user email data Docker-DCO-1.1-Signed-off-by: Josh hawn (github: jlhawn) --- docs/sources/reference/api/README.md | 1 + .../_static/io_oauth_authorization_page.jpg | Bin 0 -> 71954 bytes .../reference/api/docker_io_accounts_api.rst | 308 ++++++++++++++++++ .../reference/api/docker_io_oauth_api.rst | 233 +++++++++++++ docs/sources/reference/api/index.rst | 2 + 5 files changed, 544 insertions(+) create mode 100644 docs/sources/reference/api/_static/io_oauth_authorization_page.jpg create mode 100644 docs/sources/reference/api/docker_io_accounts_api.rst create mode 100644 docs/sources/reference/api/docker_io_oauth_api.rst diff --git a/docs/sources/reference/api/README.md b/docs/sources/reference/api/README.md index 10dede382..ec42b8973 100644 --- a/docs/sources/reference/api/README.md +++ b/docs/sources/reference/api/README.md @@ -3,3 +3,4 @@ This directory holds the authoritative specifications of APIs defined and implem * The remote API by which a docker node can be queried over HTTP * The registry API by which a docker node can download and upload container images for storage and sharing * The index search API by which a docker node can search the public index for images to download +* The docker.io OAuth and accounts API which 3rd party services can use to access account information diff --git a/docs/sources/reference/api/_static/io_oauth_authorization_page.jpg b/docs/sources/reference/api/_static/io_oauth_authorization_page.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c331987c2afbcf1667bde09967596223a9ad308 GIT binary patch literal 71954 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 Wq)*bU+32^Zfx+++^jZb}|2F}Cky`}- literal 0 HcmV?d00001 diff --git a/docs/sources/reference/api/docker_io_accounts_api.rst b/docs/sources/reference/api/docker_io_accounts_api.rst new file mode 100644 index 000000000..7976f1fdd --- /dev/null +++ b/docs/sources/reference/api/docker_io_accounts_api.rst @@ -0,0 +1,308 @@ +:title: docker.io Accounts API +:description: API Documentation for docker.io accounts. +:keywords: API, Docker, accounts, REST, documentation + + +====================== +docker.io Accounts API +====================== + +.. contents:: Table of Contents + + +1. Endpoints +============ + + +1.1 Get a single user +^^^^^^^^^^^^^^^^^^^^^ + +.. http:get:: /api/v1.1/users/:username/ + + Get profile info for the specified user. + + :param username: username of the user whose profile info is being requested. + + :reqheader Authorization: required authentication credentials of either type HTTP Basic or OAuth Bearer Token. + + :statuscode 200: success, user data returned. + :statuscode 401: authentication error. + :statuscode 403: permission error, authenticated user must be the user whose data is being requested, OAuth access tokens must have ``profile_read`` scope. + :statuscode 404: the specified username does not exist. + + **Example request**: + + .. sourcecode:: http + + GET /api/v1.1/users/janedoe/ HTTP/1.1 + Host: www.docker.io + Accept: application/json + Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": 2, + "username": "janedoe", + "url": "", + "date_joined": "2014-02-12T17:58:01.431312Z", + "type": "User", + "full_name": "Jane Doe", + "location": "San Francisco, CA", + "company": "Success, Inc.", + "profile_url": "https://docker.io/", + "gravatar_email": "jane.doe+gravatar@example.com", + "email": "jane.doe@example.com", + "is_active": true + } + + +1.2 Update a single user +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. http:patch:: /api/v1.1/users/:username/ + + Update profile info for the specified user. + + :param username: username of the user whose profile info is being updated. + + :jsonparam string full_name: (optional) the new name of the user. + :jsonparam string location: (optional) the new location. + :jsonparam string company: (optional) the new company of the user. + :jsonparam string profile_url: (optional) the new profile url. + :jsonparam string gravatar_email: (optional) the new Gravatar email address. + + :reqheader Authorization: required authentication credentials of either type HTTP Basic or OAuth Bearer Token. + :reqheader Content-Type: MIME Type of post data. JSON, url-encoded form data, etc. + + :statuscode 200: success, user data updated. + :statuscode 400: post data validation error. + :statuscode 401: authentication error. + :statuscode 403: permission error, authenticated user must be the user whose data is being updated, OAuth access tokens must have ``profile_write`` scope. + :statuscode 404: the specified username does not exist. + + **Example request**: + + .. sourcecode:: http + + PATCH /api/v1.1/users/janedoe/ HTTP/1.1 + Host: www.docker.io + Accept: application/json + Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= + + { + "location": "Private Island", + "profile_url": "http://janedoe.com/", + "company": "Retired", + } + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": 2, + "username": "janedoe", + "url": "", + "date_joined": "2014-02-12T17:58:01.431312Z", + "type": "User", + "full_name": "Jane Doe", + "location": "Private Island", + "company": "Retired", + "profile_url": "http://janedoe.com/", + "gravatar_email": "jane.doe+gravatar@example.com", + "email": "jane.doe@example.com", + "is_active": true + } + + +1.3 List email addresses for a user +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. http:get:: /api/v1.1/users/:username/emails/ + + List email info for the specified user. + + :param username: username of the user whose profile info is being updated. + + :reqheader Authorization: required authentication credentials of either type HTTP Basic or OAuth Bearer Token + + :statuscode 200: success, user data updated. + :statuscode 401: authentication error. + :statuscode 403: permission error, authenticated user must be the user whose data is being requested, OAuth access tokens must have ``email_read`` scope. + :statuscode 404: the specified username does not exist. + + **Example request**: + + .. sourcecode:: http + + GET /api/v1.1/users/janedoe/emails/ HTTP/1.1 + Host: www.docker.io + Accept: application/json + Authorization: Bearer zAy0BxC1wDv2EuF3tGs4HrI6qJp6KoL7nM + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "email": "jane.doe@example.com", + "verified": true, + "primary": true + } + ] + + +1.4 Add email address for a user +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. http:post:: /api/v1.1/users/:username/emails/ + + Add a new email address to the specified user's account. The email address + must be verified separately, a confirmation email is not automatically sent. + + :jsonparam string email: email address to be added. + + :reqheader Authorization: required authentication credentials of either type HTTP Basic or OAuth Bearer Token. + :reqheader Content-Type: MIME Type of post data. JSON, url-encoded form data, etc. + + :statuscode 201: success, new email added. + :statuscode 400: data validation error. + :statuscode 401: authentication error. + :statuscode 403: permission error, authenticated user must be the user whose data is being requested, OAuth access tokens must have ``email_write`` scope. + :statuscode 404: the specified username does not exist. + + **Example request**: + + .. sourcecode:: http + + POST /api/v1.1/users/janedoe/emails/ HTTP/1.1 + Host: www.docker.io + Accept: application/json + Content-Type: application/json + Authorization: Bearer zAy0BxC1wDv2EuF3tGs4HrI6qJp6KoL7nM + + { + "email": "jane.doe+other@example.com" + } + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 201 Created + Content-Type: application/json + + { + "email": "jane.doe+other@example.com", + "verified": false, + "primary": false + } + + +1.5 Update an email address for a user +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. http:patch:: /api/v1.1/users/:username/emails/ + + Update an email address for the specified user to either verify an email + address or set it as the primary email for the user. You cannot use this + endpoint to un-verify an email address. You cannot use this endpoint to + unset the primary email, only set another as the primary. + + :param username: username of the user whose email info is being updated. + + :jsonparam string email: the email address to be updated. + :jsonparam boolean verified: (optional) whether the email address is verified, must be ``true`` or absent. + :jsonparam boolean primary: (optional) whether to set the email address as the primary email, must be ``true`` or absent. + + :reqheader Authorization: required authentication credentials of either type HTTP Basic or OAuth Bearer Token. + :reqheader Content-Type: MIME Type of post data. JSON, url-encoded form data, etc. + + :statuscode 200: success, user's email updated. + :statuscode 400: data validation error. + :statuscode 401: authentication error. + :statuscode 403: permission error, authenticated user must be the user whose data is being updated, OAuth access tokens must have ``email_write`` scope. + :statuscode 404: the specified username or email address does not exist. + + **Example request**: + + Once you have independently verified an email address. + + .. sourcecode:: http + + PATCH /api/v1.1/users/janedoe/emails/ HTTP/1.1 + Host: www.docker.io + Accept: application/json + Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= + + { + "email": "jane.doe+other@example.com", + "verified": true, + } + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "email": "jane.doe+other@example.com", + "verified": true, + "primary": false + } + + +1.6 Delete email address for a user +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. http:delete:: /api/v1.1/users/:username/emails/ + + Delete an email address from the specified user's account. You cannot + delete a user's primary email address. + + :jsonparam string email: email address to be deleted. + + :reqheader Authorization: required authentication credentials of either type HTTP Basic or OAuth Bearer Token. + :reqheader Content-Type: MIME Type of post data. JSON, url-encoded form data, etc. + + :statuscode 204: success, email address removed. + :statuscode 400: validation error. + :statuscode 401: authentication error. + :statuscode 403: permission error, authenticated user must be the user whose data is being requested, OAuth access tokens must have ``email_write`` scope. + :statuscode 404: the specified username or email address does not exist. + + **Example request**: + + .. sourcecode:: http + + DELETE /api/v1.1/users/janedoe/emails/ HTTP/1.1 + Host: www.docker.io + Accept: application/json + Content-Type: application/json + Authorization: Bearer zAy0BxC1wDv2EuF3tGs4HrI6qJp6KoL7nM + + { + "email": "jane.doe+other@example.com" + } + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 204 NO CONTENT + Content-Length: 0 diff --git a/docs/sources/reference/api/docker_io_oauth_api.rst b/docs/sources/reference/api/docker_io_oauth_api.rst new file mode 100644 index 000000000..bed939f7d --- /dev/null +++ b/docs/sources/reference/api/docker_io_oauth_api.rst @@ -0,0 +1,233 @@ +:title: docker.io OAuth API +:description: API Documentation for docker.io's OAuth flow. +:keywords: API, Docker, oauth, REST, documentation + + +=================== +docker.io OAuth API +=================== + +.. contents:: Table of Contents + + +1. Brief introduction +===================== + +Some docker.io API requests will require an access token to authenticate. To +get an access token for a user, that user must first grant your application +access to their docker.io account. In order for them to grant your application +access you must first register your application. + +Before continuing, we encourage you to familiarize yourself with +`The OAuth 2.0 Authorization Framework `_. + + +2. Register Your Application +============================ + +You will need to register your application with docker.io before users will +be able to grant your application access to their account information. We +are currently only allowing applications selectively. To request registration +of your application send an email to support-accounts@docker.com with the +following information: + +- The name of your application +- A description of your application and the service it will provide + to docker.io users. +- A list of one or more redirect URIs that we will use for redirecting + authorization requests to your application. These are used in the step + of getting an Authorization Code. + +When your application is approved you will receive a response from the +docker.io team with your ``client_id`` and ``client_secret`` which your +application will use in the steps of getting an Authorization Code and getting +an Access Token. + + +3. Endpoints +============ + +3.1 Get an Authorization Code +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Once You have registered you are ready to start integrating docker.io accounts +into your application! The process is usually started by a user following a +link in your application to an OAuth Authorization endpoint. + +.. http:get:: /api/v1.1/o/authorize/ + + Request that a docker.io user authorize your application. If the user is + not already logged in, they will be prompted to login. The user is then + presented with a form to authorize your application for the requested + access scope. On submission, the user will be redirected to the specified + ``redirect_uri`` with an Authorization Code. + + :query client_id: The ``client_id`` given to your application at + registration. + :query response_type: MUST be set to ``code``. This specifies that you + would like an Authorization Code returned. + :query redirect_uri: The URI to redirect back to after the user has + authorized your application. If omitted, the first of your registered + ``response_uris`` is used. If included, it must be one of the URIs + which were submitted when registering your application. + :query scope: The extent of access permissions you are requesting. + Currently, the scope options are ``profile_read``, ``profile_write``, + ``email_read``, and ``email_write``. Scopes must be separated by a + space. If omitted, the default scopes ``profile_read email_read`` are + used. + :query state: (Recommended) Used by your application to maintain state + between the authorization request and callback to protect against CSRF + attacks. + + **Example Request** + + Asking the user for authorization. + + .. sourcecode:: http + + GET /api/v1.1/o/authorize/?client_id=TestClientID&response_type=code&redirect_uri=http%3A//my.app/auth_complete/&scope=profile_read%20email_read&state=abc123 HTTP/1.1 + Host: www.docker.io + + **Authorization Page** + + When the user follows a link, making the above GET request, they will be + asked to login to their docker.io account if they are not already and then + be presented with the following authorization prompt which asks the user + to authorize your application with a description of the requested scopes. + + .. image:: _static/io_oauth_authorization_page.jpg + + Once the user allows or denies your Authorization Request the user will be + redirected back to your application. Included in that request will be the + following query parameters: + + ``code`` + The Authorization code generated by the docker.io authorization server. + Present it again to request an Access Token. This code expires in 60 + seconds. + + ``state`` + If the ``state`` parameter was present in the authorization request this + will be the exact value received from that request. + + ``error`` + An error message in the event of the user denying the authorization or + some other kind of error with the request. + + +3.2 Get an Access Token +^^^^^^^^^^^^^^^^^^^^^^^ + +Once the user has authorized your application, a request will be made to your +application's specified ``redirect_uri`` which includes a ``code`` parameter +that you must then use to get an Access Token. + +.. http:post:: /api/v1.1/o/token/ + + Submit your newly granted Authorization Code and your application's + credentials to receive an Access Token and Refresh Token. The code is valid + for 60 seconds and cannot be used more than once. + + :reqheader Authorization: HTTP basic authentication using your + application's ``client_id`` and ``client_secret`` + + :form grant_type: MUST be set to ``authorization_code`` + :form code: The authorization code received from the user's redirect + request. + :form redirect_uri: The same ``redirect_uri`` used in the authentication + request. + + **Example Request** + + Using an authorization code to get an access token. + + .. sourcecode:: http + + POST /api/v1.1/o/token/ HTTP/1.1 + Host: www.docker.io + Authorization: Basic VGVzdENsaWVudElEOlRlc3RDbGllbnRTZWNyZXQ= + Accept: application/json + Content-Type: application/json + + { + "grant_type": "code", + "code": "YXV0aG9yaXphdGlvbl9jb2Rl", + "redirect_uri": "http://my.app/auth_complete/" + } + + **Example Response** + + .. sourcecode:: http + + HTTP/1.1 200 OK + Content-Type: application/json;charset=UTF-8 + + { + "username": "janedoe", + "user_id": 42, + "access_token": "t6k2BqgRw59hphQBsbBoPPWLqu6FmS", + "expires_in": 15552000, + "token_type": "Bearer", + "scope": "profile_read email_read", + "refresh_token": "hJDhLH3cfsUrQlT4MxA6s8xAFEqdgc" + } + + In the case of an error, there will be a non-200 HTTP Status and and data + detailing the error. + + +3.3 Refresh a Token +^^^^^^^^^^^^^^^^^^^ + +Once the Access Token expires you can use your ``refresh_token`` to have +docker.io issue your application a new Access Token, if the user has not +revoked access from your application. + +.. http:post:: /api/v1.1/o/token/ + + Submit your ``refresh_token`` and application's credentials to receive a + new Access Token and Refresh Token. The ``refresh_token`` can be used + only once. + + :reqheader Authorization: HTTP basic authentication using your + application's ``client_id`` and ``client_secret`` + + :form grant_type: MUST be set to ``refresh_token`` + :form refresh_token: The ``refresh_token`` which was issued to your + application. + :form scope: (optional) The scope of the access token to be returned. + Must not include any scope not originally granted by the user and if + omitted is treated as equal to the scope originally granted. + + **Example Response** + + .. sourcecode:: http + + HTTP/1.1 200 OK + Content-Type: application/json;charset=UTF-8 + + { + "username": "janedoe", + "user_id": 42, + "access_token": "t6k2BqgRw59hphQBsbBoPPWLqu6FmS", + "expires_in": 15552000, + "token_type": "Bearer", + "scope": "profile_read email_read", + "refresh_token": "hJDhLH3cfsUrQlT4MxA6s8xAFEqdgc" + } + + In the case of an error, there will be a non-200 HTTP Status and and data + detailing the error. + + +4. Use an Access Token with the API +=================================== + +Many of the docker.io API requests will require a Authorization request header +field. Simply ensure you add this header with "Bearer <``access_token``>": + +.. sourcecode:: http + + GET /api/v1.1/resource HTTP/1.1 + Host: docker.io + Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA diff --git a/docs/sources/reference/api/index.rst b/docs/sources/reference/api/index.rst index 017369143..3c84a505c 100644 --- a/docs/sources/reference/api/index.rst +++ b/docs/sources/reference/api/index.rst @@ -15,4 +15,6 @@ Your programs and scripts can access Docker's functionality via these interfaces index_api docker_remote_api remote_api_client_libraries + docker_io_oauth_api + docker_io_accounts_api