Additional Features

This documentation covers some additional features. They are not required, but they may be very helpful.

Request Hooks

Like Flask, Flask-OAuthlib has before_request and after_request hooks too. It is usually useful for setting limitation on the client request with before_request:

@oauth.before_request
def limit_client_request():
    from flask_oauthlib.utils import extract_params
    uri, http_method, body, headers = extract_params()
    request = oauth._create_request(uri, http_method, body, headers)

    client_id = request.client_key
    if not client_id:
        return
    client = Client.get(client_id)
    if over_limit(client):
        return abort(403)

    track_request(client)

And you can also modify the response with after_request:

@oauth.after_request
def valid_after_request(valid, request):
    if request.user in black_list:
        return False, request
    return valid, oauth

Bindings

Changed in version 0.4.

Bindings are objects you can use to configure flask-oauthlib for use with various data stores. They allow you to define the required getters and setters for each data store with little effort.

SQLAlchemy OAuth2

bind_sqlalchemy() sets up getters and setters for storing the user, client, token and grant with SQLAlchemy, with some sane defaults. To use this class you’ll need to create a SQLAlchemy model for each object. You can find examples of how to setup your SQLAlchemy models here: ref:oauth2.

You’ll also need to provide another function which returns the currently logged-in user.

An example of how to use bind_sqlalchemy():

oauth = OAuth2Provider(app)

bind_sqlalchemy(oauth, db.session, user=User, client=Client,
                token=Token, grant=Grant, current_user=current_user)

Any of the classes can be omitted if you wish to register the getters and setters yourself:

oauth = OAuth2Provider(app)

bind_sqlalchemy(oauth, db.session, user=User, client=Client,
                token=Token)

@oauth.grantgetter
def get_grant(client_id, code):
    pass

@oauth.grantsetter
def set_grant(client_id, code, request, *args, **kwargs):
    pass

# register tokensetter with oauth but keeping the tokengetter
# registered by `SQLAlchemyBinding`
# You would only do this for the token and grant since user and client
# only have getters
@oauth.tokensetter
def set_token(token, request, *args, **kwargs):
    pass

current_user is only used with the Grant bindings, therefore if you are going to register your own grant getter and setter you don’t need to provide that function.

Grant Cache

Since the life of a Grant token is very short (usually about 100 seconds), storing it in a relational database is inefficient. The bind_cache_grant() allows you to more efficiently cache the grant token using Memcache, Redis, or some other caching system.

An example:

oauth = OAuth2Provider(app)
app.config.update({'OAUTH2_CACHE_TYPE': 'redis'})

bind_cache_grant(app, oauth, current_user)
  • app: flask application
  • oauth: OAuth2Provider instance
  • current_user: a function that returns the current user

The configuration options are described below. The bind_cache_grant() will use the configuration options from Flask-Cache if they are set, else it will set them to the following defaults. Any configuration specific to bind_cache_grant() will take precedence over any Flask-Cache configuration that has been set.