basic oauth added
This commit is contained in:
parent
5adea3755a
commit
777d05c26c
9 changed files with 188 additions and 3 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -3,7 +3,7 @@
|
||||||
/staticfiles
|
/staticfiles
|
||||||
# /foerderbarometer/settings.py
|
# /foerderbarometer/settings.py
|
||||||
/foerderbarometer/*settings*
|
/foerderbarometer/*settings*
|
||||||
/foerderbarometer/input/settings.py
|
/input/settings.py
|
||||||
/nohup.out
|
/nohup.out
|
||||||
/logfile
|
/logfile
|
||||||
*~
|
*~
|
||||||
|
|
16
input/asgi.py
Normal file
16
input/asgi.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
"""
|
||||||
|
ASGI config for oauth_demo project.
|
||||||
|
|
||||||
|
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.asgi import get_asgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oauth_demo.settings')
|
||||||
|
|
||||||
|
application = get_asgi_application()
|
0
input/middleware/__init__.py
Normal file
0
input/middleware/__init__.py
Normal file
84
input/middleware/oauth.py
Normal file
84
input/middleware/oauth.py
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
from authlib.integrations.base_client import OAuthError
|
||||||
|
from authlib.integrations.django_client import OAuth
|
||||||
|
from authlib.oauth2.rfc6749 import OAuth2Token
|
||||||
|
from django.shortcuts import redirect
|
||||||
|
from django.utils.deprecation import MiddlewareMixin
|
||||||
|
from foerderbarometer import settings
|
||||||
|
from input import views
|
||||||
|
|
||||||
|
|
||||||
|
class OAuthMiddleware(MiddlewareMixin):
|
||||||
|
|
||||||
|
def __init__(self, get_response=None):
|
||||||
|
super().__init__(get_response)
|
||||||
|
self.oauth = OAuth()
|
||||||
|
|
||||||
|
def process_request(self, request):
|
||||||
|
if settings.OAUTH_URL_WHITELISTS is not None:
|
||||||
|
for w in settings.OAUTH_URL_WHITELISTS:
|
||||||
|
if request.path.startswith(w):
|
||||||
|
return self.get_response(request)
|
||||||
|
|
||||||
|
def update_token(token, refresh_token, access_token):
|
||||||
|
request.session['token'] = token
|
||||||
|
print('oioi')
|
||||||
|
print('oi token', token)
|
||||||
|
return None
|
||||||
|
|
||||||
|
sso_client = self.oauth.register(
|
||||||
|
settings.OAUTH_CLIENT_NAME, overwrite=True, **settings.OAUTH_CLIENT, update_token=update_token
|
||||||
|
)
|
||||||
|
|
||||||
|
if request.path.startswith('/oauth/callback'):
|
||||||
|
print('oi')
|
||||||
|
self.clear_session(request)
|
||||||
|
request.session['token'] = sso_client.authorize_access_token(request)
|
||||||
|
print('blub', request.session['token'])
|
||||||
|
print('user', self.get_current_user(sso_client, request))
|
||||||
|
if self.get_current_user(sso_client, request) is not None:
|
||||||
|
redirect_uri = request.session.pop('redirect_uri', None)
|
||||||
|
if redirect_uri is not None:
|
||||||
|
return redirect(redirect_uri)
|
||||||
|
return redirect(views.ExternView)
|
||||||
|
|
||||||
|
if request.session.get('token', None) is not None:
|
||||||
|
current_user = self.get_current_user(sso_client, request)
|
||||||
|
if current_user is not None:
|
||||||
|
return self.get_response(request)
|
||||||
|
|
||||||
|
# remember redirect URI for redirecting to the original URL.
|
||||||
|
request.session['redirect_uri'] = request.path
|
||||||
|
return sso_client.authorize_redirect(request, settings.OAUTH_CLIENT['redirect_uri'])
|
||||||
|
|
||||||
|
# fetch current login user info
|
||||||
|
# 1. check if it's in cache
|
||||||
|
# 2. fetch from remote API when it's not in cache
|
||||||
|
@staticmethod
|
||||||
|
def get_current_user(sso_client, request):
|
||||||
|
token = request.session.get('token', None)
|
||||||
|
if token is None or 'access_token' not in token:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not OAuth2Token.from_dict(token).is_expired() and 'user' in request.session:
|
||||||
|
return request.session['user']
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = sso_client.get(settings.OAUTH_CLIENT['userinfo_endpoint'], token=OAuth2Token(token))
|
||||||
|
print('json oi oi' , res.json())
|
||||||
|
if res.ok:
|
||||||
|
request.session['user'] = res.json()
|
||||||
|
return res.json()
|
||||||
|
except OAuthError as e:
|
||||||
|
print(e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def clear_session(request):
|
||||||
|
try:
|
||||||
|
del request.session['user']
|
||||||
|
del request.session['token']
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
print('destroyed')
|
|
@ -39,3 +39,33 @@ ACCOUNTS ={ # "21103": '21103 Willkommen',
|
||||||
"21140": '21140 Wikipedia-Kampagne',
|
"21140": '21140 Wikipedia-Kampagne',
|
||||||
"21141": '21141 Wikipedia-Onboarding',
|
"21141": '21141 Wikipedia-Onboarding',
|
||||||
"21150": '21150 Fürsorge und Online-Kommunikationskultur',}
|
"21150": '21150 Fürsorge und Online-Kommunikationskultur',}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# teken from working oauth prototype as additional settings
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'oauth_demo.wsgi.application'
|
||||||
|
|
||||||
|
# OAuth Settings
|
||||||
|
OAUTH_URL_WHITELISTS = []
|
||||||
|
|
||||||
|
OAUTH_CLIENT_NAME = '<name-of-the-configured-wikimedia-app>'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
OAUTH_CLIENT = {
|
||||||
|
'client_id': '<client-application-key-of-wikimedia-app>',
|
||||||
|
'client_secret': '<client-application-secret-of-wikimedia-app>',
|
||||||
|
'access_token_url': 'https://meta.wikimedia.org/w/rest.php/oauth2/access_token',
|
||||||
|
'authorize_url': 'https://meta.wikimedia.org/w/rest.php/oauth2/authorize',
|
||||||
|
'api_base_url': 'https://meta.wikimedia.org/w/rest.php/oauth2/resource',
|
||||||
|
'redirect_uri': 'http://localhost:8000/oauth/callback',
|
||||||
|
'client_kwargs': {
|
||||||
|
'scope': 'basic',
|
||||||
|
'token_placement': 'header'
|
||||||
|
},
|
||||||
|
'userinfo_endpoint': 'resource/profile',
|
||||||
|
}
|
||||||
|
|
||||||
|
OAUTH_COOKIE_SESSION_ID = 'sso_session_id'
|
||||||
|
|
||||||
|
|
41
input/settings.py.old
Executable file
41
input/settings.py.old
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
# mail for IF-OTRS
|
||||||
|
IF_EMAIL = 'community@wikimedia.de'
|
||||||
|
#IF_EMAIL = 'test-luca-ext@wikimedia.de'
|
||||||
|
#SURVEY_EMAIL = 'christof.pins@wikimedia.de'
|
||||||
|
#SURVEY_EMAIL = 'luca.wulf@cannabinieri.de'
|
||||||
|
SURVEY_EMAIL = 'sandro.halank@wikimedia.de'
|
||||||
|
# prefix for urls
|
||||||
|
SURVEYPREFIX = 'https://wikimedia.sslsurvey.de/Foerderbarometer/?'
|
||||||
|
|
||||||
|
# some links
|
||||||
|
DATAPROTECTION = "https://www.wikimedia.de/datenschutz/#datenerfassung"
|
||||||
|
FOERDERRICHTLINIEN = "https://de.wikipedia.org/wiki/Wikipedia:Wikimedia_Deutschland/F%C3%B6rderrichtlinien"
|
||||||
|
NUTZUNGSBEDINGUNGEN = 'static/input/nutzungsbedingungen.html'
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'de'
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
USE_I18N = True
|
||||||
|
USE_L10N = True
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
|
ACCOUNTS ={ # "21103": '21103 Willkommen',
|
||||||
|
"DEF": 'DEFAULT VALUE, you hould not see this!',
|
||||||
|
"21111": '21111 Förderung (reaktiv)',
|
||||||
|
"21112": '21112 WikiCon',
|
||||||
|
# "21113": '21113 Wikimania/Unterstützung Ehrenamtliche',
|
||||||
|
"21115": '21115 Lokale Räume, Berlin',
|
||||||
|
"21116": '21116 Lokale Räume, Hamburg',
|
||||||
|
"21117": '21117 Lokale Räume, Hannover',
|
||||||
|
"21118": '21118 Lokale Räume, Köln',
|
||||||
|
"21119": '21119 Lokale Räume, München',
|
||||||
|
"21120": '21120 Lokale Räume, Fürth',
|
||||||
|
"21125": '21125 Lokale Räume, allgemein',
|
||||||
|
"21130": '21130 GLAM-Förderung',
|
||||||
|
"21131": '21131 Initiative Förderung',
|
||||||
|
# "21134": '21134 Größe',
|
||||||
|
# "21137": '21137 Beitragen',
|
||||||
|
# "21138": '21138 Vermittlung',
|
||||||
|
"21140": '21140 Wikipedia-Kampagne',
|
||||||
|
"21141": '21141 Wikipedia-Onboarding',
|
||||||
|
"21150": '21150 Fürsorge und Online-Kommunikationskultur',}
|
|
@ -10,7 +10,7 @@ Da wir verpflichtet sind, über unsere geförderten Maßnahmen zu berichten, mö
|
||||||
* Wie viele Personen haben an dem Projekt teilgenommen?<br>
|
* Wie viele Personen haben an dem Projekt teilgenommen?<br>
|
||||||
* Wo können die Ergebnisse des Projektes eingesehen werden? (Projektseite, Commons-Link, Bericht o. ä.)
|
* Wo können die Ergebnisse des Projektes eingesehen werden? (Projektseite, Commons-Link, Bericht o. ä.)
|
||||||
<br><br>
|
<br><br>
|
||||||
Sollten bei dem Projekt Fotos oder andere Mediendateien entstanden sein, findest du hier eine Anleitung, wie diese bei Commons hochgeladen werden sollen.
|
Sollten bei dem Projekt Fotos oder andere Mediendateien entstanden sein, findest du <a href="https://commons.wikimedia.org/wiki/Category:Supported_by_Wikimedia_Deutschland">hier</a> eine Anleitung, wie diese bei Commons hochgeladen werden sollen.
|
||||||
<br><br>
|
<br><br>
|
||||||
Solltest du einen öffentlichen Förderantrag in der Wikipedia erstellt haben, kannst du diesen nun archivieren, indem du den Projektstatus oben im Quellcode entsprechend anpasst und die Liste der geförderten Aktivitäten entsprechend aktualisierst.
|
Solltest du einen öffentlichen Förderantrag in der Wikipedia erstellt haben, kannst du diesen nun archivieren, indem du den Projektstatus oben im Quellcode entsprechend anpasst und die Liste der geförderten Aktivitäten entsprechend aktualisierst.
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
|
@ -8,7 +8,7 @@ Da wir verpflichtet sind, über unsere geförderten Maßnahmen zu berichten, mö
|
||||||
* Wie viele Personen haben an dem Projekt teilgenommen?
|
* Wie viele Personen haben an dem Projekt teilgenommen?
|
||||||
* Wo können die Ergebnisse des Projektes eingesehen werden? (Projektseite, Commons-Link, Bericht o. ä.)
|
* Wo können die Ergebnisse des Projektes eingesehen werden? (Projektseite, Commons-Link, Bericht o. ä.)
|
||||||
|
|
||||||
Sollten bei dem Projekt Fotos oder andere Mediendateien entstanden sein, findest du hier eine Anleitung, wie diese bei Commons hochgeladen werden sollen.
|
Sollten bei dem Projekt Fotos oder andere Mediendateien entstanden sein, findest du hier eine Anleitung, wie diese bei Commons hochgeladen werden sollen: https://commons.wikimedia.org/wiki/Category:Supported_by_Wikimedia_Deutschland
|
||||||
|
|
||||||
Solltest du einen öffentlichen Förderantrag in der Wikipedia erstellt haben, kannst du diesen nun archivieren, indem du den Projektstatus oben im Quellcode entsprechend anpasst und die Liste der geförderten Aktivitäten entsprechend aktualisierst.
|
Solltest du einen öffentlichen Förderantrag in der Wikipedia erstellt haben, kannst du diesen nun archivieren, indem du den Projektstatus oben im Quellcode entsprechend anpasst und die Liste der geförderten Aktivitäten entsprechend aktualisierst.
|
||||||
|
|
||||||
|
|
|
@ -5,3 +5,17 @@ gunicorn==20.0.4
|
||||||
mysqlclient==2.1.1
|
mysqlclient==2.1.1
|
||||||
sqlparse==0.4.3
|
sqlparse==0.4.3
|
||||||
whitenoise==6.2.0
|
whitenoise==6.2.0
|
||||||
|
asgiref
|
||||||
|
Authlib==1.2.1
|
||||||
|
certifi==2023.7.22
|
||||||
|
cffi==1.16.0
|
||||||
|
chardet==5.2.0
|
||||||
|
charset-normalizer==3.3.0
|
||||||
|
cryptography==41.0.4
|
||||||
|
idna==3.4
|
||||||
|
pycparser==2.21
|
||||||
|
pytz==2023.3.post1
|
||||||
|
requests==2.31.0
|
||||||
|
six==1.16.0
|
||||||
|
typing_extensions==4.8.0
|
||||||
|
urllib3==2.0.6
|
||||||
|
|
Loading…
Reference in a new issue