Code Monkey home page Code Monkey logo

alf's Introduction

alf

https://travis-ci.org/globocom/alf.svg?branch=master

Python OAuth 2 Client

alf is an OAuth 2 Client based on requests.Session with seamless support for the Client Credentials Flow.

/assets/alf.jpeg?raw=true

Features

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

Usage

Initialize the client and use it as a requests.Session object.

from alf.client import Client

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

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

alf.put(
    resource_uri, data='{"name": "alf"}',
    headers={'Content-Type': 'application/json'})

alf.get(resource_uri)

alf.delete(resource_uri)

Using your custom token storage

Now passing an object with get and set attributes you can store or retrieve a token.

This object can be a Redis, Memcache or your custom object.

from alf.client import Client
from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0)

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

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

alf.put(
    resource_uri, data='{"name": "alf"}',
    headers={'Content-Type': 'application/json'})

alf.get(resource_uri)

alf.delete(resource_uri)

How does it work?

Before the request, a token will be requested on the authentication endpoint and a JSON response with the access_token and expires_in keys will be expected.

Multiple attempts will be issued after an error response from the endpoint if the token_retries argument is used. Check token-retrying for more info.

alf keeps the token until it is expired according to the expires_in value.

The token will be used on a Bearer authorization header for the original request.

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

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.

The token will be reused for every following request until it is expired.

Token Retrying

The client supports the retry interface from urllib3 to repeat attempts to retrieve the token from the endpoint.

The following code will retry the token request 5 times when the response status is 500 and it will wait 0.3 seconds longer after each error (known as backoff).

from requests.packages.urllib3.util import Retry
from alf.client import Client

alf = Client(
    token_endpoint='http://example.com/token',
    client_id='client-id',
    client_secret='secret',
    token_retry=Retry(total=5, status_forcelist=[500], backoff_factor=0.3))

Workflow

/assets/workflow.png?raw=true

Troubleshooting

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

Related projects

An extended client that uses Django's cache backend to share tokens between server instances.

A port of the alf client using tornado's AsyncHTTPClient.

alf's People

Contributors

dmvieira avatar heliocorreia avatar marcelometal avatar pedroputz avatar ricobl avatar rodsenra avatar scorphus avatar viniciuschagas avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.