May 24, 2020

Como crear un login con Flask y Github

Como crear un login con Flask y Github

En este ejemplo practico te enseñare como crear un login con Flask y Github usando Authlib.

Indice

  • Creación de entorno virtual
  • Instalación de dependencias
  • Creación de servidor Flask
  • Configurar Authlib para colocar nuestras credenciales
  • Creación de ruta login para redireccionar al callback URL
  • Creación de callback URL

Creación de entorno virtual En este caso yo decidí usar virtualenv pero puedes usar pipenv si tu gustas.

virtualenv venv
source ./venv/bin/activate # activa el entorno virtual

Instalación de dependencias

pip install Authlib Flask requests

Creación de servidor Flask


from flask import Flask


app = Flask(__name__)


if __name__ == "__main__":
    app.run(debug=True)

Configurar Authlib para colocar nuestras credenciales

para esta configuracion necesitamos un secret_key , si tu prefieres puedes ponerla en una variable de entorno ya que es secreta.

oauth.register() le especificamos todas las configuraciones de Github, te recomiendo solo colocar tu client_id y client_secret los demas son por defecto.

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)


app.secret_key = 'myscretkey'
#configuraciones de oauth
oauth = OAuth(app)
github = oauth.register(
    name='github',
    client_id='',
    client_secret='',
    access_token_url='https://github.com/login/oauth/access_token',
    access_token_params=None,
    authorize_url='https://github.com/login/oauth/authorize',
    authorize_params=None,
    api_base_url='https://api.github.com/',
    client_kwargs={'scope': 'user:email'},
)


if __name__ == "__main__":
    app.run(debug=True)

Creación de ruta login para redireccionar al callback URL

Creamos una ruta /login la cual servira para redireccionar a la interfaz de facebook donde el usuario coloca su correo y contraseña.

oauth.create_client() creamos un nuevo cliente en este caso le llamaremos github .

url_for() indicamos la ruta de callback de github en este caso a la ruta le llame ‘authorize’.

authorize_redirect() Crea un redireccionamiento HTTP para el punto final de autorización

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)


app.secret_key = 'myscretkey'
#configuraciones de oauth
oauth = OAuth(app)
github = oauth.register(
    name='github',
    client_id='',
    client_secret='',
    access_token_url='https://github.com/login/oauth/access_token',
    access_token_params=None,
    authorize_url='https://github.com/login/oauth/authorize',
    authorize_params=None,
    api_base_url='https://api.github.com/',
    client_kwargs={'scope': 'user:email'},
)

@app.route("/")
def index():
    return f'Hola'


@app.route('/login')
def registro():
    github = oauth.create_client('github')
    redirect_uri = url_for('authorize', _external=True)
    return github.authorize_redirect(redirect_uri)

if __name__ == "__main__":
    app.run(debug=True)

Creación de callback URL

Creamos una ruta /authorize la cual servira para obtener los datos de los usuarios que ingresaron sus datos.

@app.route('/login')
def registro():
   github = oauth.create_client('github')
   redirect_uri = url_for('authorize', _external=True)
   return github.authorize_redirect(redirect_uri)

@app.route('/authorize')
def authorize():
   github = oauth.create_client('github')
   token = github.authorize_access_token()
   resp = github.get('user', token=token)
   profile = resp.json()
   # do something with the token and profile
   print(profile, token)
   return redirect('/')


if __name__ == "__main__":
   app.run(debug=True)

   

Nuestro ejemplo quedaria de la siguiente manera:

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)


app.secret_key = 'myscretkey'
#configuraciones de oauth
oauth = OAuth(app)
github = oauth.register(
    name='github',
    client_id='',
    client_secret='',
    access_token_url='https://github.com/login/oauth/access_token',
    access_token_params=None,
    authorize_url='https://github.com/login/oauth/authorize',
    authorize_params=None,
    api_base_url='https://api.github.com/',
    client_kwargs={'scope': 'user:email'},
)

@app.route("/")
def index():
    return f'Hola'


@app.route('/login')
def registro():
    github = oauth.create_client('github')
    redirect_uri = url_for('authorize', _external=True)
    return github.authorize_redirect(redirect_uri)

@app.route('/authorize')
def authorize():
    github = oauth.create_client('github')
    token = github.authorize_access_token()
    resp = github.get('user', token=token)
    profile = resp.json()
    # do something with the token and profile
    print(profile, token)
    return redirect('/')


if __name__ == "__main__":
    app.run(debug=True)