Skip to content

Commit bfbfd2d

Browse files
Add Support for google and other provider login
1 parent e7ec947 commit bfbfd2d

File tree

7 files changed

+89
-20
lines changed

7 files changed

+89
-20
lines changed

authenticator/adapters/db/api.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ def get_all_users(self):
1414
output.append({'name': user['name'], 'email': user['email']})
1515
return jsonify({'result': output})
1616

17-
def add_users(self, name, email):
17+
def add_users(self, name, email, provider):
1818
try:
1919
collection = self.client.db['users']
20-
collection_id = collection.insert({'name': name, 'email': email})
21-
return jsonify({'result': collection_id})
20+
count = collection.count_documents({'email': email})
21+
if count == 0:
22+
collection_id = collection.insert(
23+
{'name': name, 'email': email, 'provider': provider})
24+
return jsonify({'result': str(collection_id)})
25+
return jsonify({'result': "User already signed up"})
2226
except Exception:
2327
print("ISSUE")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
To login via Google visit
2+
```bash
3+
127.0.0.1:5000/login/google
4+
```
5+
in the browser. provided the mongo docker container is up and running to enter

authenticator/adapters/login/__init__.py

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from authlib.integrations.flask_client import OAuth
2+
3+
4+
class loginManager(object):
5+
6+
def __init__(self, app):
7+
self.auth = OAuth(app)

authenticator/app.py

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,79 @@
1+
from configparser import ConfigParser
2+
13
from flask import Flask
24
from flask import jsonify
3-
from flask import request
5+
from flask import request, url_for, redirect, session
6+
from flask_login import logout_user
47

58
from authenticator.adapters.db import api as db_api
6-
from authenticator import config
9+
from authenticator.adapters.login import loginmanager
10+
11+
config = ConfigParser()
12+
config.read("config.ini")
13+
14+
database = config.get('default', 'db')
15+
host = config.get('default', 'db_host')
16+
port = config.get('default', 'db_port')
717

818
app = Flask(__name__)
19+
app.config['MONGO_URI'] = f'mongodb://{host}:{port}/{database}'
20+
app.config['SECRET_KEY'] = "b9dd1b2f"
21+
app.config['GOOGLE_CLIENT_ID'] = config.get('google-oauth', 'client_id')
22+
app.config['GOOGLE_CLIENT_SECRET'] = config.get(
23+
'google-oauth', 'client_secret')
924

10-
app.config['MONGO_DBNAME'] = config.DATABASE
11-
app.config['MONGO_URI'] = f'mongodb://{config.DB_HOST}:{config.DB_PORT}/{config.DATABASE}'
1225

1326
db_obj = db_api.MongoAdapters(app)
27+
login_obj = loginmanager.loginManager(app)
1428

1529

1630
@app.route('/users', methods=['GET'])
1731
def get_users():
1832
return db_obj.get_all_users()
1933

2034

21-
@app.route('/add', methods=['POST'])
22-
def add_users():
23-
name = request.json['name']
24-
email = request.json['email']
25-
return db_obj.add_users(name, email)
35+
@app.route('/', methods=['GET'])
36+
def index():
37+
return "Welcome to nomad Authenticator."
38+
39+
40+
def add_users(name, email, provider):
41+
return db_obj.add_users(name, email, provider)
42+
43+
44+
@app.route('/login/google')
45+
def google_login():
46+
login_obj.auth.register(
47+
name='google',
48+
client_id=app.config["GOOGLE_CLIENT_ID"],
49+
client_secret=app.config["GOOGLE_CLIENT_SECRET"],
50+
access_token_url='https://accounts.google.com/o/oauth2/token',
51+
access_token_params=None,
52+
authorize_url='https://accounts.google.com/o/oauth2/auth',
53+
authorize_params=None,
54+
api_base_url='https://www.googleapis.com/oauth2/v1/',
55+
# This is only needed if using openId to fetch user info
56+
userinfo_endpoint='https://openidconnect.googleapis.com/v1/userinfo',
57+
client_kwargs={'scope': 'openid email profile'},
58+
)
59+
google = login_obj.auth.create_client('google')
60+
redirect_uri = url_for('google_authorize', _external=True)
61+
return google.authorize_redirect(redirect_uri)
62+
63+
64+
@app.route('/login/google/authorize')
65+
def google_authorize():
66+
google = login_obj.auth.create_client('google')
67+
token = google.authorize_access_token()
68+
resp = google.get('userinfo').json()
69+
return add_users(resp['name'], resp['email'], "google")
70+
71+
72+
@app.route('/logout')
73+
def user_logout():
74+
for key in list(session.keys()):
75+
session.pop(key)
76+
return redirect('/')
2677

2778

2879
if __name__ == '__main__':

authenticator/config.ini

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[default]
2+
db = nomad
3+
db_host = localhost
4+
db_port = 27017
5+
app_port = 5000
6+
7+
[google-oauth]
8+
name = google
9+
client_id = 1034883885605-gvj78f1cg3urngprb0jjfr3p0olqh8tr.apps.googleusercontent.com
10+
client_secret = jPbO8Hxm20DkefDqmD4EyhCs

authenticator/config.py

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)