Archived
1

Compare commits

..

11 Commits

Author SHA1 Message Date
ventilaar
741ac73e35 redirect to secure site, since it's supported 2022-04-06 12:48:13 +02:00
ventilaar
bb5390928e working kubernetes services, just add the secret variables 2022-04-06 12:33:02 +02:00
ventilaar
e9be4808ed change callback domain and add mango to dockerfile 2022-04-06 12:28:38 +02:00
ventilaar
3b6312b596 change callback domain and add mango to dockerfile 2022-04-06 12:28:24 +02:00
ventilaar
f31221caf0 function serverless works! 2022-04-05 15:31:38 +02:00
ventilaar
f1b0ace7ae terraform works! 2022-04-05 14:02:10 +02:00
ventilaar
c77485c4a1 Merge remote-tracking branch 'origin/master' 2022-04-04 22:23:35 +02:00
ventilaar
755e3be41e works but need to set network security groups straight 2022-04-04 22:23:26 +02:00
Ventilaar
d7dd7b5947 beter gedetailleerder uitgelegd 2022-04-04 22:15:05 +02:00
Ventilaar
4b56c4bd55 created kube deployment of api and gui, just need to test it 2022-04-04 21:59:14 +02:00
Ventilaar
aadfe81674 add required mongo connection string 2022-04-03 13:12:36 +02:00
9 changed files with 321 additions and 31 deletions

View 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

View 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

File diff suppressed because one or more lines are too long

View File

@@ -6,5 +6,6 @@ RUN pip install --no-cache-dir -r /app/requirements.txt
COPY openid.py /app/
COPY dnszone.py /app/
COPY openid.py /app/
COPY mango.py /app
COPY api.py /app/
CMD ["python3", "/app/api.py"]

View File

@@ -14,7 +14,7 @@ class GoogleOID:
self.settings = {'client_id': '954325872153-1v466clrtgg6h4ptt2ne5pgpb9mhilr5.apps.googleusercontent.com',
'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
def settings(self): # make it so that the settings variable is callable

View File

@@ -14,7 +14,7 @@ class GoogleOID:
self.settings = {'client_id': '954325872153-1v466clrtgg6h4ptt2ne5pgpb9mhilr5.apps.googleusercontent.com',
'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
def settings(self): # make it so that the settings variable is callable

View 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

View File

@@ -41,6 +41,7 @@ services:
DNS_SERVER: bind
DNS_PORT: 53
OPENID_SECRET: CHANGEME
MONGO_CONNECTIONSTRING: "mongodb://root:test@mongo:27017"
gui:
image: 4grxfq/gui

View File

@@ -1,50 +1,55 @@
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?
client_id=CLIENTID &
response_type=code &
scope=openid profile email &
redirect_uri=CALLBACK &
nonce=RANDOM &
client_id=CLIENTID & # de client id van je applicatie die je bij stap 1 hebt gegenereerd
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 & # de data die je opvraagt(openid=jwt profile=naam, foto enz... email=email)
redirect_uri=CALLBACK & # waar google de client naar redirect met parameters
nonce=RANDOM # om een replay attack te voorkomen
RESPONSE
GET HTTP REDIRECT CALLBACK # een get request naar de callback met de volgende arguments
code=AUTHORIZATIONCODE &
scope=email profile
authuser=0
prompt=none
RESPONSE # de onderstaande krijgt je applicatie terug op je callback
GET http://localhost:5000/callback # een get request naar de callback met de volgende arguments
code=AUTHORIZATIONCODE & # de code die je moet uitwisselen met je secret key
scope=email profile & # de scopes die je mag opvragen
authuser=0 & #
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.
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?
code=AUTORIZATIONCODE &
client_id=CLIENTID
client_secret=CSECRET &
code=AUTORIZATIONCODE & # de code die je van de client hebt gekregen
client_id=CLIENTID & # je applicatie id
client_secret=CSECRET & # je applicatie secret
redirect_uri=CALLBACK & # wordt niet gebruikt wel verplicht
grant_type=authorization_code
grant_type=authorization_code # de type code die je meegeeft
RESPONSE
200 OK
{
"access_token": "ACCESS_TOKEN", # hoeft in principe niets mee gedaan te worden
"expires_in": 3312,
"scope": "https://www.googleapis.com/auth/userinfo.profile openid https://www.googleapis.com/auth/userinfo.email",
"token_type": "Bearer",
"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
"access_token": "ACCESS_TOKEN", # deze kan je gebruiken om extra profiel data op te vragen bij de google profile api
"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", # de scopes die je access_token mag benaderen
"token_type": "Bearer", # de onderstaande id_token type
"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
}
```
5. Nadat je de response hebt gekeken moet je de id_token maniluperen zodat je de base64 encoded object tussen de twee
punten verkrijgt.
7. in principe voor puur openid authenticatie moet je de client de jwt toesturen, hiermee authentiseerd de client dan
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.