Metadata-Version: 2.0
Name: aio-alf
Version: 0.1.3
Summary: OAuth Client For aiohttp
Home-page: https://github.com/globocom/aio-alf
Author: Globo.com
Author-email: entretenimento1@corp.globo.com
License: MIT
Description-Content-Type: UNKNOWN
Keywords: oauth client client_credentials aiohtpp
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX
Classifier: Operating System :: Unix
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.6
Requires-Dist: aiohttp (>=2.3.0)
Provides-Extra: tests
Requires-Dist: mock; extra == 'tests'
Requires-Dist: asynctest; extra == 'tests'
Requires-Dist: bumpversion; extra == 'tests'
Requires-Dist: nose; extra == 'tests'
Requires-Dist: coverage; extra == 'tests'
Requires-Dist: yanc; extra == 'tests'
Requires-Dist: ipdb; extra == 'tests'
Requires-Dist: tox; extra == 'tests'
Requires-Dist: flake8; extra == 'tests'

aio-alf |build-status|
===========

aiohttp OAuth 2 Client
---------------------

`aio-alf` is a OAuth 2 Client base on the aiohttp's AsyncHTTPClient

Features
--------

* Automatic token retrieving and renewing
* Token expiration control
* Automatic retry on status 401 (UNAUTHORIZED)

Usage
-----

Initialize the client and use it as a AsyncHTTPClient object.

.. code-block:: python

    from aioalf.client import Client
    from aioalf.httpclient import HTTPRequest

    client = Client(
        token_endpoint='http://example.com/token',
        client_id='client-id',
        client_secret='secret')

    resource_uri = 'http://example.com/resource'

    response = await client.request(
        'POST',
        resource_uri,
        data='{"name": "alf"}',
        headers={'Content-Type': 'application/json'}
    )


Alternatively one can pass directly a string to the fetch client

.. code-block:: python

    # ...
    response = await client.request(
        'POST',
        'http://example.com/resource',
        data='{"name": "alf"}',
        headers={'Content-Type': 'application/json'}
    )



How it works?
-------------

Before any request the client tries to retrieve a token on the endpoint,
expecting a JSON response with the ``access_token`` and ``expires_in`` keys.

The client keeps the token until it is expired, according to the ``expires_in``
value.

After getting the token, the request is issued with a `Bearer authorization
header <http://tools.ietf.org/html/draft-ietf-oauth-v2-31#section-7.1>`_:

.. code-block::

    GET /resource/1 HTTP/1.1
    Host: example.com
    Authorization: Bearer token

If the request fails with a 401 (UNAUTHORIZED) status, a new token is retrieved
from the endpoint and the request is retried. This happens only once, if it
fails again the error response is returned.


Troubleshooting
---------------

In case of an error retrieving a token, the error response will be returned,
the real request won't happen.


Related projects
----------------

This project tries to be an adaptation to aiohttp of
`alf <https://github.com/globocom/alf>`_


.. |build-status| image:: https://secure.travis-ci.org/globocom/aio-alf.png?branch=master
                  :target: https://travis-ci.org/globocom/aio-alf


