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)
