oauth/oauth.py
author durandn
Tue, 16 Feb 2016 15:43:00 +0100
changeset 1 5f50937893ac
child 5 4407b131a70e
permissions -rw-r--r--
Commit work on metaeducation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     1
# coding: utf-8
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     2
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     3
from datetime import datetime, timedelta
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     4
from flask import Flask
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     5
from flask import session, request
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     6
from flask import render_template, redirect, jsonify
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     7
from flask_sqlalchemy import SQLAlchemy
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     8
from werkzeug.security import gen_salt
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
     9
from flask_oauthlib.provider import OAuth2Provider
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    10
from settings.oauth_settings import OAuthSettings
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    11
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    12
app = Flask(__name__, template_folder='templates')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    13
app.debug = True
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    14
app.secret_key = 'secret'
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    15
app.config.from_object(OAuthSettings)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    16
app.config.update({
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    17
    'SQLALCHEMY_DATABASE_URI': 'sqlite:///db.sqlite',
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    18
})
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    19
db = SQLAlchemy(app)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    20
oauth = OAuth2Provider(app)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    21
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    22
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    23
class User(db.Model):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    24
    id = db.Column(db.Integer, primary_key=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    25
    username = db.Column(db.String(40), unique=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    26
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    27
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    28
class Client(db.Model):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    29
    client_id = db.Column(db.String(40), primary_key=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    30
    client_secret = db.Column(db.String(55), nullable=False)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    31
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    32
    _redirect_uris = db.Column(db.Text)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    33
    _default_scopes = db.Column(db.Text)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    34
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    35
    @property
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    36
    def client_type(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    37
        return 'public'
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    38
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    39
    @property
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    40
    def redirect_uris(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    41
        if self._redirect_uris:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    42
            return self._redirect_uris.split()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    43
        return []
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    44
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    45
    @property
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    46
    def default_redirect_uri(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    47
        return self.redirect_uris[0]
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    48
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    49
    @property
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    50
    def default_scopes(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    51
        if self._default_scopes:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    52
            return self._default_scopes.split()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    53
        return []
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    54
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    55
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    56
class Grant(db.Model):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    57
    id = db.Column(db.Integer, primary_key=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    58
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    59
    user_id = db.Column(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    60
        db.Integer, db.ForeignKey('user.id', ondelete='CASCADE')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    61
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    62
    user = db.relationship('User')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    63
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    64
    client_id = db.Column(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    65
        db.String(40), db.ForeignKey('client.client_id'),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    66
        nullable=False,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    67
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    68
    client = db.relationship('Client')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    69
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    70
    code = db.Column(db.String(255), index=True, nullable=False)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    71
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    72
    redirect_uri = db.Column(db.String(255))
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    73
    expires = db.Column(db.DateTime)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    74
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    75
    _scopes = db.Column(db.Text)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    76
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    77
    def delete(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    78
        db.session.delete(self)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    79
        db.session.commit()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    80
        return self
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    81
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    82
    @property
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    83
    def scopes(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    84
        if self._scopes:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    85
            return self._scopes.split()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    86
        return []
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    87
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    88
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    89
class Token(db.Model):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    90
    id = db.Column(db.Integer, primary_key=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    91
    client_id = db.Column(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    92
        db.String(40), db.ForeignKey('client.client_id'),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    93
        nullable=False,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    94
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    95
    client = db.relationship('Client')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    96
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    97
    user_id = db.Column(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    98
        db.Integer, db.ForeignKey('user.id')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
    99
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   100
    user = db.relationship('User')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   101
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   102
    # currently only bearer is supported
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   103
    token_type = db.Column(db.String(40))
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   104
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   105
    access_token = db.Column(db.String(255), unique=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   106
    refresh_token = db.Column(db.String(255), unique=True)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   107
    expires = db.Column(db.DateTime)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   108
    _scopes = db.Column(db.Text)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   109
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   110
    @property
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   111
    def scopes(self):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   112
        if self._scopes:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   113
            return self._scopes.split()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   114
        return []
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   115
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   116
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   117
def current_user():
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   118
    if 'id' in session:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   119
        uid = session['id']
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   120
        return User.query.get(uid)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   121
    return None
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   122
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   123
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   124
@app.route('/', methods=('GET', 'POST'))
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   125
def home():
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   126
    if request.method == 'POST':
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   127
        username = request.form.get('username')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   128
        user = User.query.filter_by(username=username).first()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   129
        if not user:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   130
            user = User(username=username)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   131
            db.session.add(user)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   132
            db.session.commit()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   133
        session['id'] = user.id
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   134
        return redirect('/')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   135
    user = current_user()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   136
    return render_template('oauth/home.html', user=user)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   137
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   138
def generate_credentials(redirect_uris):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   139
    item = Client(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   140
        client_id=gen_salt(40),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   141
        client_secret=gen_salt(50),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   142
        _redirect_uris=' '.join(redirect_uris),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   143
        _default_scopes='basic',
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   144
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   145
    db.session.add(item)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   146
    db.session.commit()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   147
    return jsonify(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   148
        client_id=item.client_id,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   149
        client_secret=item.client_secret,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   150
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   151
    
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   152
@app.route('/get-client-credentials')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   153
def make_client_credentials():
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   154
    return generate_credentials(app.config.get("CLIENT_REDIRECT_URIS", []))
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   155
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   156
@app.route('/get-renkan-credentials')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   157
def make_renkan_credentials():
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   158
    return generate_credentials(app.config.get("RENKAN_REDIRECT_URIS", []))
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   159
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   160
@oauth.clientgetter
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   161
def load_client(client_id):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   162
    return Client.query.filter_by(client_id=client_id).first()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   163
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   164
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   165
@oauth.grantgetter
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   166
def load_grant(client_id, code):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   167
    return Grant.query.filter_by(client_id=client_id, code=code).first()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   168
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   169
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   170
@oauth.grantsetter
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   171
def save_grant(client_id, code, request, *args, **kwargs):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   172
    # decide the expires time yourself
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   173
    expires = datetime.utcnow() + timedelta(seconds=100)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   174
    grant = Grant(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   175
        client_id=client_id,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   176
        code=code['code'],
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   177
        redirect_uri=request.redirect_uri,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   178
        _scopes=' '.join(request.scopes),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   179
        user=current_user(),
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   180
        expires=expires
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   181
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   182
    db.session.add(grant)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   183
    db.session.commit()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   184
    return grant
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   185
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   186
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   187
@oauth.tokengetter
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   188
def load_token(access_token=None, refresh_token=None):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   189
    if access_token:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   190
        return Token.query.filter_by(access_token=access_token).first()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   191
    elif refresh_token:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   192
        return Token.query.filter_by(refresh_token=refresh_token).first()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   193
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   194
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   195
@oauth.tokensetter
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   196
def save_token(token, request, *args, **kwargs):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   197
    toks = Token.query.filter_by(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   198
        client_id=request.client.client_id,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   199
        user_id=request.user.id
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   200
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   201
    # make sure that every client has only one token connected to a user
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   202
    for t in toks:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   203
        db.session.delete(t)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   204
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   205
    expires_in = token.pop('expires_in')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   206
    expires = datetime.utcnow() + timedelta(seconds=expires_in)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   207
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   208
    tok = Token(
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   209
        access_token=token['access_token'],
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   210
        refresh_token=token['refresh_token'],
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   211
        token_type=token['token_type'],
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   212
        _scopes=token['scope'],
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   213
        expires=expires,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   214
        client_id=request.client.client_id,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   215
        user_id=request.user.id,
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   216
    )
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   217
    db.session.add(tok)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   218
    db.session.commit()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   219
    return tok
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   220
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   221
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   222
@app.route('/oauth/token', methods=['GET', 'POST'])
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   223
@oauth.token_handler
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   224
def access_token():
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   225
    return None
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   226
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   227
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   228
@app.route('/oauth/authorize', methods=['GET', 'POST'])
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   229
@oauth.authorize_handler
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   230
def authorize(*args, **kwargs):
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   231
    user = current_user()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   232
    if not user:
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   233
        return redirect('/')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   234
    if request.method == 'GET':
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   235
        client_id = kwargs.get('client_id')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   236
        client = Client.query.filter_by(client_id=client_id).first()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   237
        kwargs['client'] = client
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   238
        kwargs['user'] = user
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   239
        return render_template('oauth/authorize.html', **kwargs)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   240
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   241
    confirm = request.form.get('confirm', 'no')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   242
    return confirm == 'yes'
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   243
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   244
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   245
@app.route('/api/me')
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   246
@oauth.require_oauth()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   247
def me():
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   248
    user = request.oauth.user
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   249
    return jsonify(id=user.id, username=user.username)
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   250
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   251
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   252
if __name__ == '__main__':
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   253
    db.create_all()
5f50937893ac Commit work on metaeducation
durandn
parents:
diff changeset
   254
    app.run()