small corrections on oauth server and allauth provider + implemented post_save signals to reference resources into itop ged
--- a/oauth/oauth.py Mon Feb 29 12:23:37 2016 +0100
+++ b/oauth/oauth.py Tue Mar 01 17:39:09 2016 +0100
@@ -206,7 +206,6 @@
@app.route('/oauth/oauth2/authorize', methods=['GET', 'POST'])
@oauth.authorize_handler
def authorize(*args, **kwargs):
- print(request.headers)
user = current_user()
if not user:
return redirect('/')
@@ -229,7 +228,6 @@
@app.route('/rest/oauth/validate/<token>')
def validate_token(token):
- print(request.headers)
database_token = Token.query.filter_by(access_token=token).first()
related_client = database_token.client
return jsonify(
@@ -239,14 +237,23 @@
description= "",
scope=database_token.scopes
)
-
+
+@app.route('/ws/resource/<resource_id>', methods=["POST", "PUT"])
+@oauth.require_oauth()
+def reference_resource(resource_id):
+ print("#########################")
+ print(request.headers)
+ print("#########################")
+ print(request.data)
+ return "Resource was referenced", 200
+
def init_client(client_id, client_secret, redirect_uris, client_owner, confidential=False):
client = Client.query.filter_by(client_id=client_id, client_secret=client_secret).first()
if not client:
print("Creating client for "+client_owner)
user = User.query.filter_by(username=client_owner).first()
if not user:
- user = User(username=username)
+ user = User(username=client_owner)
db.session.add(user)
db.session.commit()
if confidential:
@@ -270,7 +277,8 @@
client_id=app.config["RENKAN_CLIENT_ID"],
client_secret=app.config["RENKAN_CLIENT_SECRET"],
redirect_uris=app.config["RENKAN_REDIRECT_URIS"],
- client_owner=app.config["RENKAN_SERVER_USER"]
+ client_owner=app.config["RENKAN_SERVER_USER"],
+ confidential=True
)
init_client(
client_id=app.config["MOCK_GED_CLIENT_ID"],
--- a/oauth/settings/client_settings.py.tmpl Mon Feb 29 12:23:37 2016 +0100
+++ b/oauth/settings/client_settings.py.tmpl Tue Mar 01 17:39:09 2016 +0100
@@ -1,6 +1,9 @@
class ClientSettings(object):
+ CLIENT_ID = ''
+ CLIENT_SECRET = ''
+
# OAUTH SERVER CONFIG
BASE_URL = 'http://127.0.0.1:5000/rest/'
REQUEST_TOKEN_URL = None
--- a/server/src/metaeducation/mtdc_oauth_provider/provider.py Mon Feb 29 12:23:37 2016 +0100
+++ b/server/src/metaeducation/mtdc_oauth_provider/provider.py Tue Mar 01 17:39:09 2016 +0100
@@ -2,7 +2,7 @@
from allauth.socialaccount import providers
from allauth.socialaccount.providers.base import ProviderAccount
from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
-
+from django.conf import settings
class MtdcProvider(OAuth2Provider):
id = 'mtdc'
@@ -11,12 +11,12 @@
def extract_uid(self, data):
print("retrieved data: "+str(data))
- return data.get('id', '')
+ return data.get(settings.MTDC_USERID_FIELD_NAME, '')
def extract_common_fields(self, data):
- return {"username": data.get("username", "")}
+ return {"username": data.get(settings.MTDC_USERNAME_FIELD_NAME, "")}
def extract_extra_data(self, data):
- return {"username": data.get("username", "")}
+ return {"username": data.get(settings.MTDC_USERNAME_FIELD_NAME, "")}
providers.registry.register(MtdcProvider)
\ No newline at end of file
--- a/server/src/metaeducation/mtdc_oauth_provider/views.py Mon Feb 29 12:23:37 2016 +0100
+++ b/server/src/metaeducation/mtdc_oauth_provider/views.py Tue Mar 01 17:39:09 2016 +0100
@@ -48,9 +48,9 @@
self.profile_url = self.oauth_base_url + settings.MTDC_PROFILE_URL
def pre_social_login(self, request, sociallogin):
- user = sociallogin.user
+ socialuser = sociallogin.user
try:
- user = get_user_model().objects.get(username=user.username) # if user exists, connect the account to the existing account and login
+ user = get_user_model().objects.get(username=socialuser.username) # if user exists, connect the account to the existing account and login
sociallogin.state['process'] = 'connect'
perform_login(request, user, 'none')
except get_user_model().DoesNotExist:
--- a/server/src/metaeducation/settings/dev.py.tmpl Mon Feb 29 12:23:37 2016 +0100
+++ b/server/src/metaeducation/settings/dev.py.tmpl Tue Mar 01 17:39:09 2016 +0100
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from metaeducation.settings import *
-import os, logging
+import os, logging, base64
#TODO override
DEBUG = True
@@ -43,4 +43,9 @@
MTDC_AUTHORIZE_URL = "" # This URL is the authorize endpoint URL, relative to a <CONTEXT> Base url that will be passed as query arg to the server
MTDC_PROFILE_URL = "" # This URL is the user profile endpoint URL, relative to a <CONTEXT> Base url that will be passed as query arg to the server
-MTDC_VALIDATE_TOKEN_URL = "" # This URL is the ABSOLUTE url for validating a token. There will be no context involved for validation token from server to server.
\ No newline at end of file
+MTDC_VALIDATE_TOKEN_URL = "" # This URL is the ABSOLUTE url for validating a token. There will be no context involved for validation token from server to server.
+MTDC_REFERENCE_RESOURCE_BASE_URL = "" # This URL is the ABSOLUTE url for referencing a resource (ged webservice)
+MTDC_CLIENT_CREDENTIALS_TOKEN_URL = "" # This URL is the ABSOLUTE url for getting a token via Client Credentials from server to server.
+
+MTDC_USERNAME_FIELD_NAME = "username" # Name of the username field that will be transmitted in response to the profile url request (usually "username", for metaeduc will probably be "displayName")
+MTDC_USERID_FIELD_NAME = "id" # Name of the user id field that will be transmitted in response to the profile url request (usually "id")
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/metaeducation/signals.py Tue Mar 01 17:39:09 2016 +0100
@@ -0,0 +1,61 @@
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+from django.contrib.auth import get_user_model
+from django.conf import settings
+import requests, json
+
+@receiver(post_save)
+def reference_created_renkan(sender, instance, created, **kwargs):
+ from renkanmanager.models import Renkan
+ if created and sender == Renkan:
+ token_response = requests.post(
+ settings.MTDC_CLIENT_CREDENTIALS_TOKEN_URL+"?grant_type=client_credentials",
+ data = {},
+ headers = {
+ "Authorization": "Basic %s" % settings.MTDC_AUTH_CODE
+ }
+ )
+ if token_response.status_code == 200:
+ token = json.loads(token_response.text)['access_token']
+ post_data = json.dumps({
+ "userId": instance.creator.id,
+ "title": instance.title
+ })
+ reference_response = requests.post(
+ settings.MTDC_REFERENCE_RESOURCE_BASE_URL+str(instance.renkan_guid),
+ data = post_data,
+ headers = {
+ "Authorization": "Bearer %s" % token
+ }
+ )
+
+@receiver(post_save)
+def reference_modified_title(sender, instance, created, **kwargs):
+ from renkanmanager.models import Renkan, Revision
+ if created and sender == Revision:
+ try:
+ referenced_renkan = Renkan.objects.get(renkan_guid = instance.revision_guid)
+ except Renkan.DoesNotExist:
+ return
+ if referenced_renkan.revision_count > 1:
+ # This means the revision isn't the first of the Renkan and therefore we shouldn't do anything
+ token_response = requests.post(
+ settings.MTDC_CLIENT_CREDENTIALS_TOKEN_URL+"?grant_type=client_credentials",
+ data = {},
+ headers = {
+ "Authorization": "Basic %s" % settings.MTDC_AUTH_CODE
+ }
+ )
+ if token_response.status_code == 200:
+ token = json.loads(token_response.text)['access_token']
+ put_data = json.dumps({
+ "userId": referenced_renkan.creator.id,
+ "title": referenced_renkan.title
+ })
+ reference_response = requests.post(
+ settings.MTDC_REFERENCE_RESOURCE_BASE_URL+str(instance.renkan_guid),
+ data = put_data,
+ headers = {
+ "Authorization": "Bearer %s" % token
+ }
+ )
\ No newline at end of file