Compare commits
	
		
			14 Commits
		
	
	
		
			ed2e93ed8e
			...
			master
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					741ac73e35 | ||
| 
						 | 
					bb5390928e | ||
| 
						 | 
					e9be4808ed | ||
| 
						 | 
					3b6312b596 | ||
| 
						 | 
					f31221caf0 | ||
| 
						 | 
					f1b0ace7ae | ||
| 
						 | 
					c77485c4a1 | ||
| 
						 | 
					755e3be41e | ||
| 
						 | 
					d7dd7b5947 | ||
| 
						 | 
					4b56c4bd55 | ||
| 
						 | 
					aadfe81674 | ||
| 
						 | 
					265476d24e | ||
| 
						 | 
					af6fc43067 | ||
| 
						 | 
					67ed0e0f34 | 
							
								
								
									
										10
									
								
								eindopdracht/azure/bind/cloudinit.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								eindopdracht/azure/bind/cloudinit.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					#cloud-config
 | 
				
			||||||
 | 
					bootcmd:
 | 
				
			||||||
 | 
					  - echo "making directories"
 | 
				
			||||||
 | 
					  - mkdir -p /etc/bind
 | 
				
			||||||
 | 
					  - mkdir -p /var/lib/bind
 | 
				
			||||||
 | 
					  - echo "downloading files"
 | 
				
			||||||
 | 
					  - wget https://git.ventilaar.nl/ventilaar/clim/raw/branch/master/eindopdracht/testomgeving/bind/named.conf.local -O /etc/bind/named.conf.local
 | 
				
			||||||
 | 
					  - wget https://git.ventilaar.nl/ventilaar/clim/raw/branch/master/eindopdracht/testomgeving/bind/dns.mashallah.nl.zone -O /var/lib/bind/dns.mashallah.nl.zone
 | 
				
			||||||
 | 
					packages:
 | 
				
			||||||
 | 
					 - bind9
 | 
				
			||||||
							
								
								
									
										63
									
								
								eindopdracht/azure/kubernetes/api.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								eindopdracht/azure/kubernetes/api.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					apiVersion: apps/v1
 | 
				
			||||||
 | 
					kind: Deployment
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: api-deployment
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    app: api-deployment
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  replicas: 1
 | 
				
			||||||
 | 
					  selector:
 | 
				
			||||||
 | 
					    matchLabels:
 | 
				
			||||||
 | 
					      app: api-deployment
 | 
				
			||||||
 | 
					  template:
 | 
				
			||||||
 | 
					    metadata:
 | 
				
			||||||
 | 
					      labels:
 | 
				
			||||||
 | 
					        app: api-deployment
 | 
				
			||||||
 | 
					    spec:
 | 
				
			||||||
 | 
					      containers:
 | 
				
			||||||
 | 
					      - name: api-container
 | 
				
			||||||
 | 
					        image: 4grxfq/api
 | 
				
			||||||
 | 
					        imagePullPolicy: Always
 | 
				
			||||||
 | 
					        ports:
 | 
				
			||||||
 | 
					        - containerPort: 5001
 | 
				
			||||||
 | 
					          name: api-port
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          - name: OPENID_SECRET
 | 
				
			||||||
 | 
					            value:
 | 
				
			||||||
 | 
					          - name: DNS_SERVER
 | 
				
			||||||
 | 
					            value: dnsns.mashallah.nl
 | 
				
			||||||
 | 
					          - name: MONGO_CONNECTIONSTRING
 | 
				
			||||||
 | 
					            value:
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Service
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: api-service
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    run: api-service
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  ports:
 | 
				
			||||||
 | 
					  - port: 80
 | 
				
			||||||
 | 
					    targetPort: 5001
 | 
				
			||||||
 | 
					    protocol: TCP
 | 
				
			||||||
 | 
					  selector:
 | 
				
			||||||
 | 
					    app: api-deployment
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: networking.k8s.io/v1
 | 
				
			||||||
 | 
					kind: Ingress
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: api-ingress
 | 
				
			||||||
 | 
					  annotations:
 | 
				
			||||||
 | 
					    kubernetes.io/ingress.class: addon-http-application-routing
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  rules:
 | 
				
			||||||
 | 
					  - host: dnsapi.mashallah.nl
 | 
				
			||||||
 | 
					    http:
 | 
				
			||||||
 | 
					      paths:
 | 
				
			||||||
 | 
					      - path: /
 | 
				
			||||||
 | 
					        pathType: Prefix
 | 
				
			||||||
 | 
					        backend:
 | 
				
			||||||
 | 
					          service:
 | 
				
			||||||
 | 
					            name: api-service
 | 
				
			||||||
 | 
					            port:
 | 
				
			||||||
 | 
					              number: 80
 | 
				
			||||||
							
								
								
									
										63
									
								
								eindopdracht/azure/kubernetes/gui.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								eindopdracht/azure/kubernetes/gui.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					apiVersion: apps/v1
 | 
				
			||||||
 | 
					kind: Deployment
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: gui-deployment
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    app: gui-deployment
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  replicas: 1
 | 
				
			||||||
 | 
					  selector:
 | 
				
			||||||
 | 
					    matchLabels:
 | 
				
			||||||
 | 
					      app: gui-deployment
 | 
				
			||||||
 | 
					  template:
 | 
				
			||||||
 | 
					    metadata:
 | 
				
			||||||
 | 
					      labels:
 | 
				
			||||||
 | 
					        app: gui-deployment
 | 
				
			||||||
 | 
					    spec:
 | 
				
			||||||
 | 
					      containers:
 | 
				
			||||||
 | 
					      - name: gui-container
 | 
				
			||||||
 | 
					        image: 4grxfq/gui
 | 
				
			||||||
 | 
					        imagePullPolicy: Always
 | 
				
			||||||
 | 
					        ports:
 | 
				
			||||||
 | 
					        - containerPort: 5000
 | 
				
			||||||
 | 
					          name: gui-port
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          - name: OPENID_SECRET
 | 
				
			||||||
 | 
					            value:
 | 
				
			||||||
 | 
					          - name: DNS_API
 | 
				
			||||||
 | 
					            value: http://api-service:80
 | 
				
			||||||
 | 
					          - name: MONGO_CONNECTIONSTRING
 | 
				
			||||||
 | 
					            value:
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Service
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: gui-service
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    run: gui-service
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  ports:
 | 
				
			||||||
 | 
					  - port: 80
 | 
				
			||||||
 | 
					    targetPort: 5000
 | 
				
			||||||
 | 
					    protocol: TCP
 | 
				
			||||||
 | 
					  selector:
 | 
				
			||||||
 | 
					    app: gui-deployment
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: networking.k8s.io/v1
 | 
				
			||||||
 | 
					kind: Ingress
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: gui-ingress
 | 
				
			||||||
 | 
					  annotations:
 | 
				
			||||||
 | 
					    kubernetes.io/ingress.class: addon-http-application-routing
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  rules:
 | 
				
			||||||
 | 
					  - host: dnsgui.mashallah.nl
 | 
				
			||||||
 | 
					    http:
 | 
				
			||||||
 | 
					      paths:
 | 
				
			||||||
 | 
					      - path: /
 | 
				
			||||||
 | 
					        pathType: Prefix
 | 
				
			||||||
 | 
					        backend:
 | 
				
			||||||
 | 
					          service:
 | 
				
			||||||
 | 
					            name: gui-service
 | 
				
			||||||
 | 
					            port:
 | 
				
			||||||
 | 
					              number: 80
 | 
				
			||||||
							
								
								
									
										117
									
								
								eindopdracht/azure/terraform/main.tf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								eindopdracht/azure/terraform/main.tf
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -6,5 +6,6 @@ RUN pip install --no-cache-dir -r /app/requirements.txt
 | 
				
			|||||||
COPY openid.py /app/
 | 
					COPY openid.py /app/
 | 
				
			||||||
COPY dnszone.py /app/
 | 
					COPY dnszone.py /app/
 | 
				
			||||||
COPY openid.py /app/
 | 
					COPY openid.py /app/
 | 
				
			||||||
 | 
					COPY mango.py /app
 | 
				
			||||||
COPY api.py /app/
 | 
					COPY api.py /app/
 | 
				
			||||||
CMD ["python3", "/app/api.py"]
 | 
					CMD ["python3", "/app/api.py"]
 | 
				
			||||||
@@ -6,6 +6,7 @@ from ipaddress import ip_address, IPv4Address
 | 
				
			|||||||
from openid import *
 | 
					from openid import *
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
from dns import resolver
 | 
					from dns import resolver
 | 
				
			||||||
 | 
					from mango import Mango
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app = Flask(__name__)
 | 
					app = Flask(__name__)
 | 
				
			||||||
api = Api(app)
 | 
					api = Api(app)
 | 
				
			||||||
@@ -18,13 +19,14 @@ parser.add_argument('type')
 | 
				
			|||||||
# verander de variabelen hieronder als je de script handmatig uitvoert
 | 
					# verander de variabelen hieronder als je de script handmatig uitvoert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnsserver = os.environ.get('DNS_SERVER')
 | 
					dnsserver = os.environ.get('DNS_SERVER')
 | 
				
			||||||
 | 
					mongo_connect = os.environ.get('MONGO_CONNECTIONSTRING')
 | 
				
			||||||
dnsserverport = int(os.environ.get('DNS_PORT', default=53))
 | 
					dnsserverport = int(os.environ.get('DNS_PORT', default=53))
 | 
				
			||||||
debug = bool(os.environ.get('API_DEBUG', default=False))
 | 
					debug = bool(os.environ.get('API_DEBUG', default=False))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# end change
 | 
					# end change
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if dnsserver is None:
 | 
					if dnsserver is None or mongo_connect is None:
 | 
				
			||||||
    print('You did not set a DNS_SERVER environ')
 | 
					    print('You did not set DNS_SERVER or MONGO_CONNECTIONSTRING environ')
 | 
				
			||||||
    exit(1)
 | 
					    exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,15 +49,18 @@ def make_fqdn_check(subname, parentdomain):  # make fqdn from given subdomain na
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def validate_authorization(req):  # validate authorization header
 | 
					def validate_authorization(req):  # validate authorization header
 | 
				
			||||||
    jwt = req.get('Authorization')
 | 
					    jwt = req.get('Authorization')  # get Authorization header
 | 
				
			||||||
    if jwt is None:
 | 
					    if jwt is None:  # if not set
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    jwt = jwt.split(' ')[1]  # get jwt from header
 | 
					    form, value = jwt.split(' ')  # get header type and value
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if GoogleOID.check_jwt(jwt)['error'] is False:  # check if jwt is valid
 | 
					 | 
				
			||||||
        return True
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if form == "Bearer":  # if bearer(openid)
 | 
				
			||||||
 | 
					        if GoogleOID.check_jwt(value)['error'] is False:  # check if jwt is valid
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					    elif form == "Basic":  # basic auth stored in db
 | 
				
			||||||
 | 
					        if mango.check_api_key(value):  # check if apikey exists in db
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
    return False
 | 
					    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -190,4 +195,5 @@ if __name__ == '__main__':
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # do not setup dns zone globally because it errors on simultaneous requests
 | 
					    # do not setup dns zone globally because it errors on simultaneous requests
 | 
				
			||||||
    GoogleOID = GoogleOID()  # setup google oid
 | 
					    GoogleOID = GoogleOID()  # setup google oid
 | 
				
			||||||
 | 
					    mango = Mango(mongo_connect)
 | 
				
			||||||
    app.run(debug=debug, host='0.0.0.0', port=5001)  # run werkzeug
 | 
					    app.run(debug=debug, host='0.0.0.0', port=5001)  # run werkzeug
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								eindopdracht/dns_api/mango.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								eindopdracht/dns_api/mango.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					from pymongo import MongoClient
 | 
				
			||||||
 | 
					import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Mango:
 | 
				
			||||||
 | 
					    def __init__(self, connect):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.client = MongoClient(connect)
 | 
				
			||||||
 | 
					            self.users = self.client['dns']['users']
 | 
				
			||||||
 | 
					            self.keys = self.client['dns']['keys']
 | 
				
			||||||
 | 
					        except ConnectionError:
 | 
				
			||||||
 | 
					            print('MongoDB connection error')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_check_sso_uuid(self, uuid):  # checks if uuid exist in any document
 | 
				
			||||||
 | 
					        found = self.users.find_one({"sso.google.profile.sub": uuid})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if found is None:  # None if nothing found
 | 
				
			||||||
 | 
					            return {"error": True, "reason": "User not found"}
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return {"error": False}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_update_lastlogin(self, uuid):  # replaces lastlogin with current time for given user
 | 
				
			||||||
 | 
					        found = self.users.find_one({"sso.google.profile.sub": uuid})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if found is None:
 | 
				
			||||||
 | 
					            return {"error": True, "reason": "User not found"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        found['sso']['google']['lastlogin'] = datetime.datetime.utcnow()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.users.replace_one({"sso.google.profile.sub": uuid}, found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return {"error": False}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_update_profile(self, profile):  # overwrites user profile with the one that google has given
 | 
				
			||||||
 | 
					        found = self.users.find_one({"sso.google.profile.sub": profile['sub']})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        found['sso']['google']['profile'] = profile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.users.replace_one({"sso.google.profile.sub": profile['sub']}, found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return {"error": False}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_get_profile(self, uuid):  # returns google profile as stored in db for a given user
 | 
				
			||||||
 | 
					        found = self.users.find_one(({"sso.google.profile.sub": uuid}))
 | 
				
			||||||
 | 
					        return found['sso']['google']['profile']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_get_lastlogin(self, uuid):  # returns lastlogin in pretty format for given user
 | 
				
			||||||
 | 
					        found = self.users.find_one(({"sso.google.profile.sub": uuid}))
 | 
				
			||||||
 | 
					        return found['sso']['google']['lastlogin'].strftime('%A %d-%m-%Y, %H:%M:%S')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_add_new_sub(self, uuid):  # adds new document in db with only the sub for a given uuid
 | 
				
			||||||
 | 
					        self.users.insert_one({'sso':{'google':{'profile':{"sub": str(uuid)}}}})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_overwrite_jwt(self, uuid, jwt):  # overwrite jwt in db for given user
 | 
				
			||||||
 | 
					        found = self.users.find_one({"sso.google.profile.sub": uuid})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        found['sso']['google']['jwt'] = jwt
 | 
				
			||||||
 | 
					        self.users.replace_one({"sso.google.profile.sub": uuid}, found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def google_get_jwt(self, uuid):  # return jwt as stored in db for given user
 | 
				
			||||||
 | 
					        found = self.users.find_one({"sso.google.profile.sub": uuid})
 | 
				
			||||||
 | 
					        return found['sso']['google']['jwt']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def check_api_key(self, key):  # True or False if api key exists in api keys db
 | 
				
			||||||
 | 
					        if self.keys.find_one({"key": key}):
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        return False
 | 
				
			||||||
@@ -14,7 +14,7 @@ class GoogleOID:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.settings = {'client_id': '954325872153-1v466clrtgg6h4ptt2ne5pgpb9mhilr5.apps.googleusercontent.com',
 | 
					        self.settings = {'client_id': '954325872153-1v466clrtgg6h4ptt2ne5pgpb9mhilr5.apps.googleusercontent.com',
 | 
				
			||||||
                         'client_secret': client_secret,
 | 
					                         'client_secret': client_secret,
 | 
				
			||||||
                         'callback_uri': 'http://dnsdash.mashallah.nl:5000/login/gcp/callback',
 | 
					                         'callback_uri': 'https://dnsgui.mashallah.nl/login/gcp/callback',
 | 
				
			||||||
                         'key_server': 'https://www.googleapis.com/oauth2/v3/certs'}  # global oid settings
 | 
					                         'key_server': 'https://www.googleapis.com/oauth2/v3/certs'}  # global oid settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def settings(self):  # make it so that the settings variable is callable
 | 
					    def settings(self):  # make it so that the settings variable is callable
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,5 +3,6 @@ flask_restful
 | 
				
			|||||||
pyjwt
 | 
					pyjwt
 | 
				
			||||||
pyjwt[crypto]
 | 
					pyjwt[crypto]
 | 
				
			||||||
dnspython
 | 
					dnspython
 | 
				
			||||||
 | 
					pymongo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
werkzeug == 2.0.3  # er zit een fout in de laatste versie die plain http post requests altijd als json interperteerd
 | 
					werkzeug == 2.0.3  # er zit een fout in de laatste versie die plain http post requests altijd als json interperteerd
 | 
				
			||||||
@@ -7,6 +7,7 @@ class Mango:
 | 
				
			|||||||
        try:
 | 
					        try:
 | 
				
			||||||
            self.client = MongoClient(connect)
 | 
					            self.client = MongoClient(connect)
 | 
				
			||||||
            self.users = self.client['dns']['users']
 | 
					            self.users = self.client['dns']['users']
 | 
				
			||||||
 | 
					            self.keys = self.client['dns']['keys']
 | 
				
			||||||
        except ConnectionError:
 | 
					        except ConnectionError:
 | 
				
			||||||
            print('MongoDB connection error')
 | 
					            print('MongoDB connection error')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,3 +60,8 @@ class Mango:
 | 
				
			|||||||
    def google_get_jwt(self, uuid):  # return jwt as stored in db for given user
 | 
					    def google_get_jwt(self, uuid):  # return jwt as stored in db for given user
 | 
				
			||||||
        found = self.users.find_one({"sso.google.profile.sub": uuid})
 | 
					        found = self.users.find_one({"sso.google.profile.sub": uuid})
 | 
				
			||||||
        return found['sso']['google']['jwt']
 | 
					        return found['sso']['google']['jwt']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def check_api_key(self, key):  # True or False if api key exists in api keys db
 | 
				
			||||||
 | 
					        if self.keys.find_one({"key": key}):
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        return False
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@ class GoogleOID:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.settings = {'client_id': '954325872153-1v466clrtgg6h4ptt2ne5pgpb9mhilr5.apps.googleusercontent.com',
 | 
					        self.settings = {'client_id': '954325872153-1v466clrtgg6h4ptt2ne5pgpb9mhilr5.apps.googleusercontent.com',
 | 
				
			||||||
                         'client_secret': client_secret,
 | 
					                         'client_secret': client_secret,
 | 
				
			||||||
                         'callback_uri': 'http://dnsdash.mashallah.nl:5000/login/gcp/callback',
 | 
					                         'callback_uri': 'https://dnsgui.mashallah.nl/login/gcp/callback',
 | 
				
			||||||
                         'key_server': 'https://www.googleapis.com/oauth2/v3/certs'}  # global oid settings
 | 
					                         'key_server': 'https://www.googleapis.com/oauth2/v3/certs'}  # global oid settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def settings(self):  # make it so that the settings variable is callable
 | 
					    def settings(self):  # make it so that the settings variable is callable
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								eindopdracht/lambda/lambda_function.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								eindopdracht/lambda/lambda_function.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					import json
 | 
				
			||||||
 | 
					import boto3
 | 
				
			||||||
 | 
					import base64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def lambda_handler(event, context):
 | 
				
			||||||
 | 
						method = str(event.get('requestContext').get('http').get('method'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dynamodb = boto3.resource('dynamodb')
 | 
				
			||||||
 | 
						table = dynamodb.Table('lambdatable')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if method == "POST":
 | 
				
			||||||
 | 
							key = str(event.get('pathParameters').get('id'))
 | 
				
			||||||
 | 
							url = str(base64.b64decode(event.get('body')), 'utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							table.put_item(Item={'key': key, 'url': url})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return {'message': url}
 | 
				
			||||||
 | 
						elif method == "DELETE":
 | 
				
			||||||
 | 
							key = str(event.get('pathParameters').get('id'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							table.delete_item(Key={'key': key})
 | 
				
			||||||
 | 
							return {'message': key}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							key = str(event.get('pathParameters').get('id'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							data = table.get_item(Key={"key": key})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(data) is 1:
 | 
				
			||||||
 | 
								return {'message': 'No such key'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							response = {
 | 
				
			||||||
 | 
								"statusCode": 302,
 | 
				
			||||||
 | 
								"headers": {
 | 
				
			||||||
 | 
									'Location': data['Item']['url']
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return response
 | 
				
			||||||
@@ -17,6 +17,7 @@ services:
 | 
				
			|||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - ./mongo/import.sh:/docker-entrypoint-initdb.d/import.sh:ro
 | 
					      - ./mongo/import.sh:/docker-entrypoint-initdb.d/import.sh:ro
 | 
				
			||||||
      - ./mongo/test-data.json:/docker-entrypoint-initdb.d/test-data.json:ro
 | 
					      - ./mongo/test-data.json:/docker-entrypoint-initdb.d/test-data.json:ro
 | 
				
			||||||
 | 
					      - ./mongo/test-keys.json:/docker-entrypoint-initdb.d/test-keys.json:ro
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - "5027:27017"
 | 
					      - "5027:27017"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,6 +41,7 @@ services:
 | 
				
			|||||||
      DNS_SERVER: bind
 | 
					      DNS_SERVER: bind
 | 
				
			||||||
      DNS_PORT: 53
 | 
					      DNS_PORT: 53
 | 
				
			||||||
      OPENID_SECRET: CHANGEME
 | 
					      OPENID_SECRET: CHANGEME
 | 
				
			||||||
 | 
					      MONGO_CONNECTIONSTRING: "mongodb://root:test@mongo:27017"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gui:
 | 
					  gui:
 | 
				
			||||||
    image: 4grxfq/gui
 | 
					    image: 4grxfq/gui
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,2 +1,3 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/sh
 | 
				
			||||||
mongoimport /docker-entrypoint-initdb.d/test-data.json -d dns -c users --drop -u root -p test --authenticationDatabase admin
 | 
					mongoimport /docker-entrypoint-initdb.d/test-data.json -d dns -c users --drop -u root -p test --authenticationDatabase admin
 | 
				
			||||||
 | 
					mongoimport /docker-entrypoint-initdb.d/test-keys.json -d dns -c keys --drop -u root -p test --authenticationDatabase admin
 | 
				
			||||||
							
								
								
									
										3
									
								
								eindopdracht/testomgeving/mongo/test-keys.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								eindopdracht/testomgeving/mongo/test-keys.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "key": "qQT0IuiJwTIz5Jlxw7CwFEeNdcPJUzQqM16PVebJUqaXcLsNFiSVgr8se74itZA="
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,50 +1,55 @@
 | 
				
			|||||||
1. regristreer gcp een applicatie en genereer client keys
 | 
					1. regristreer gcp een applicatie en genereer client keys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2. zet op login met google button
 | 
					2. zet een webserver functie op die de client redirect naar google met de onderstaande GET parameters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3. de button opent functie dat de volgende request stuurt naar de url
 | 
					3. plaats een knop of hyperlink op de home pagina die naar de bovenste functie redirect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. de flask applicatie redirect de client naar de onderstaande parameter, de onderstaande GET request wordt dus door de
 | 
				
			||||||
 | 
					   client uitgevoerd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
GET https://accounts.google.com/o/oauth2/v2/auth?
 | 
					GET https://accounts.google.com/o/oauth2/v2/auth?
 | 
				
			||||||
    client_id=CLIENTID &
 | 
					    client_id=CLIENTID &            # de client id van je applicatie die je bij stap 1 hebt gegenereerd
 | 
				
			||||||
    response_type=code &
 | 
					    response_type=code &            # je vraagt google om een code(deze kan je met je app secret van stap 1 een authorization token verkrijgen)
 | 
				
			||||||
    scope=openid profile email &
 | 
					    scope=openid profile email &    # de data die je opvraagt(openid=jwt profile=naam, foto enz... email=email) 
 | 
				
			||||||
    redirect_uri=CALLBACK &
 | 
					    redirect_uri=CALLBACK &         # waar google de client naar redirect met parameters
 | 
				
			||||||
    nonce=RANDOM &
 | 
					    nonce=RANDOM                    # om een replay attack te voorkomen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RESPONSE
 | 
					RESPONSE                            # de onderstaande krijgt je applicatie terug op je callback
 | 
				
			||||||
GET HTTP REDIRECT CALLBACK  # een get request naar de callback met de volgende arguments
 | 
					GET http://localhost:5000/callback  # een get request naar de callback met de volgende arguments
 | 
				
			||||||
    code=AUTHORIZATIONCODE &
 | 
					    code=AUTHORIZATIONCODE &        # de code die je moet uitwisselen met je secret key
 | 
				
			||||||
    scope=email profile
 | 
					    scope=email profile &           # de scopes die je mag opvragen
 | 
				
			||||||
    authuser=0
 | 
					    authuser=0 &                    #
 | 
				
			||||||
    prompt=none
 | 
					    prompt=none                     #
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Hiervan moeten we de code parameter verkrijgen
 | 
					Hiervan moeten we de code parameter gebruiken
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4. Nadat je de authorization code hebt verkregen moet je die omzetten in een (refresh)token, hierbij krijg je ook een
 | 
					5. Nadat je de authorization code hebt verkregen moet je die omzetten in een (refresh)token, hierbij krijg je ook een
 | 
				
			||||||
jwt met alle gebruiker profiel data.
 | 
					jwt met alle gebruiker profiel data.
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
 | 
					6. De onderstaande request moet je applicatie in de achtergrond uitvoeren om de code om te wisselen naar bruikbare data
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
POST https://oauth2.googleapis.com/token?
 | 
					POST https://oauth2.googleapis.com/token?
 | 
				
			||||||
    code=AUTORIZATIONCODE &
 | 
					    code=AUTORIZATIONCODE &         # de code die je van de client hebt gekregen
 | 
				
			||||||
    client_id=CLIENTID
 | 
					    client_id=CLIENTID    &         # je applicatie id
 | 
				
			||||||
    client_secret=CSECRET &
 | 
					    client_secret=CSECRET &         # je applicatie secret
 | 
				
			||||||
    redirect_uri=CALLBACK &  # wordt niet gebruikt wel verplicht
 | 
					    redirect_uri=CALLBACK &         # wordt niet gebruikt wel verplicht
 | 
				
			||||||
    grant_type=authorization_code
 | 
					    grant_type=authorization_code   # de type code die je meegeeft
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
RESPONSE
 | 
					RESPONSE
 | 
				
			||||||
200 OK
 | 
					200 OK
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	"access_token": "ACCESS_TOKEN",  # hoeft in principe niets mee gedaan te worden
 | 
						"access_token": "ACCESS_TOKEN",                                                                                     # deze kan je gebruiken om extra profiel data op te vragen bij de google profile api
 | 
				
			||||||
	"expires_in": 3312,
 | 
						"expires_in": 3312,                                                                                                 # de tijd voor hoelang de access_token geldig is in seconden
 | 
				
			||||||
	"scope": "https://www.googleapis.com/auth/userinfo.profile openid https://www.googleapis.com/auth/userinfo.email",
 | 
						"scope": "https://www.googleapis.com/auth/userinfo.profile openid https://www.googleapis.com/auth/userinfo.email",  # de scopes die je access_token mag benaderen
 | 
				
			||||||
	"token_type": "Bearer",
 | 
						"token_type": "Bearer",                                                                                             # de onderstaande id_token type
 | 
				
			||||||
	"id_token": "aaaa.bbbbbbbbbbbbbbbb.cccccccccc"
 | 
						"id_token": "aaaa.bbbbbbbbbbbbbbbb.cccccccccc"                                                                      # de JWT, als je deze checkt met de keys van google is de authorisatie voldoende, in het midden van de 2 punten is de profiel informatie te vinden encoded in base64
 | 
				
			||||||
	# de JWT, als je deze checkt met de keys van google is de authorisatie voldoende, in het midden van de 2 punten is de profiel informatie te vinden encoded in base64
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
5. Nadat je de response hebt gekeken moet je de id_token maniluperen zodat je de base64 encoded object tussen de twee
 | 
					7. in principe voor puur openid authenticatie moet je de client de jwt toesturen, hiermee authentiseerd de client dan
 | 
				
			||||||
punten verkrijgt.
 | 
					met je applicatie zolang de jwt geldig is.
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
6. In de base64 encoded JWT staat alle profiel data, bekijk de database of de sub key overeenkomt met wat er is opgeslagen
 | 
					8. aan de flask kant moet je de Authorization header van elke request van de client controleren of de meegegeven JWT
 | 
				
			||||||
 | 
					Bearer token nog geldig is, door google is uitgegeven, geldend voor jouw applicatie, hier zijn libraries voor te vinden.
 | 
				
			||||||
		Reference in New Issue
	
	Block a user