I’m back. A lot of things have changed since I last wrote and one of that is my go-to language.
Earlier today, I needed to write a simple Flask application using GitLab as the OAuth2 provider.
I immediately turned to Flask-OAuth to do the job, but it keeps on failing with:
SSLHandshakeError: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed |
It seems to be a problem with httplib2.
After struggling for quite some time, I found Flask-OAuthlib that claims to be a replacement for the outdated Flask-Oauth. It worked like a charm.
GitLab’s documentation on consuming its OAuth2 is quite basic. Below is a basic implementation that works.
All you need to do is change the gitlab.example.com to your GitLab server, and add the consumer_key and consumer_secret. If successful, the main page will display a JSON with the logged on user’s details.
from flask import Flask, render_template, redirect, url_for, session, request, jsonify from flask_oauthlib.client import OAuth app = Flask(__name__) app.debug = True app.secret_key = 'development' oauth = OAuth(app) gitlab = oauth.remote_app('gitlab', base_url='https://gitlab.example.com/api/v3/', request_token_url=None, access_token_url='https://gitlab.example.com/oauth/token', authorize_url='https://gitlab.example.com/oauth/authorize', access_token_method='POST', consumer_key='', consumer_secret='' ) @app.route('/') def index(): if 'gitlab_token' in session: me = gitlab.get('user') return jsonify(me.data) return redirect(url_for('login')) @app.route('/login') def login(): return gitlab.authorize(callback=url_for('authorized', _external=True, _scheme='https')) @app.route('/logout') def logout(): del session['gitlab_token'] return redirect(url_for('index')) @app.route('/login/authorized') def authorized(): resp = gitlab.authorized_response() if resp is None: return 'Access denied: reason=%s error=%s' % ( request.args['error'], request.args['error_description'] ) session['gitlab_token'] = (resp['access_token'], '') return redirect(url_for('index')) @gitlab.tokengetter def get_gitlab_oauth_token(): return session.get('gitlab_token') if __name__ == "__main__": app.run() |
I hope it saves someone some time.