mirror of
https://github.com/nikdoof/test-auth.git
synced 2025-12-14 23:02:19 +00:00
Added Callback support for API apps
This commit is contained in:
@@ -0,0 +1,40 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
import datetime
|
||||||
|
from south.db import db
|
||||||
|
from south.v2 import SchemaMigration
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Migration(SchemaMigration):
|
||||||
|
|
||||||
|
def forwards(self, orm):
|
||||||
|
|
||||||
|
# Adding field 'AuthAPIKey.callback'
|
||||||
|
db.add_column('api_authapikey', 'callback', self.gf('django.db.models.fields.CharField')(default='', max_length=200, blank=True), keep_default=False)
|
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm):
|
||||||
|
|
||||||
|
# Deleting field 'AuthAPIKey.callback'
|
||||||
|
db.delete_column('api_authapikey', 'callback')
|
||||||
|
|
||||||
|
|
||||||
|
models = {
|
||||||
|
'api.authapikey': {
|
||||||
|
'Meta': {'object_name': 'AuthAPIKey'},
|
||||||
|
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'callback': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
|
||||||
|
'url': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
'api.authapilog': {
|
||||||
|
'Meta': {'ordering': "['access_datetime']", 'object_name': 'AuthAPILog'},
|
||||||
|
'access_datetime': ('django.db.models.fields.DateTimeField', [], {}),
|
||||||
|
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'key': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['api.AuthAPIKey']"}),
|
||||||
|
'url': ('django.db.models.fields.CharField', [], {'max_length': '200'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete_apps = ['api']
|
||||||
@@ -6,9 +6,10 @@ class AuthAPIKey(models.Model):
|
|||||||
""" Auth API Key storage model """
|
""" Auth API Key storage model """
|
||||||
|
|
||||||
name = models.CharField("Service Name", max_length=200)
|
name = models.CharField("Service Name", max_length=200)
|
||||||
url = models.CharField("Service URL", max_length=200, blank=True)
|
url = models.CharField("Service URL", max_length=200, blank=True, help_text="URL that the service is available at")
|
||||||
active = models.BooleanField(default=True)
|
active = models.BooleanField(default=True)
|
||||||
key = models.CharField("API Key", max_length=200, blank=True)
|
key = models.CharField("API Key", max_length=200, blank=True, help_text="API key for the service to use")
|
||||||
|
callback = models.CharField("Callback URL", max_length=200, blank=True, help_text="URL for the callback service to connect to")
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.key or self.key == '':
|
if not self.key or self.key == '':
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
|
import sys
|
||||||
import logging
|
import logging
|
||||||
|
import urllib
|
||||||
|
import urllib2
|
||||||
|
from hashlib import sha512
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db.models import signals
|
from django.db.models import signals
|
||||||
|
from django.utils import simplejson as json
|
||||||
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from celery.signals import task_failure
|
from celery.signals import task_failure
|
||||||
from celery.decorators import task
|
from celery.decorators import task
|
||||||
|
|
||||||
|
from api.models import AuthAPIKey
|
||||||
from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerAlliance
|
from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerAlliance
|
||||||
from eve_api.app_defines import *
|
from eve_api.app_defines import *
|
||||||
from sso.models import ServiceAccount, SSOUser
|
from sso.models import ServiceAccount, SSOUser
|
||||||
@@ -94,6 +100,27 @@ def update_user_access(user, **kwargs):
|
|||||||
servacc.save()
|
servacc.save()
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
notifyurls = AuthAPIKey.objects.filter(active=True).exclude(callback='')
|
||||||
|
if notifyurls.count():
|
||||||
|
data = {'username': user.username, 'groups': list(user.groups.all().values('id', 'name'))}
|
||||||
|
# Update remote services with poking the notification URLs
|
||||||
|
for endpoint in notifyurls:
|
||||||
|
url, key = endpoint.callback, endpoint.key
|
||||||
|
jsonstr = json.dumps(data)
|
||||||
|
hash = sha512('%s-%s' % (key, jsonstr)).hexdigest()
|
||||||
|
req = urllib2.Request(url, urllib.urlencode({'data': jsonstr, 'auth': hash}))
|
||||||
|
try:
|
||||||
|
if sys.version_info < (2, 6):
|
||||||
|
conn = urllib2.urlopen(req)
|
||||||
|
else:
|
||||||
|
conn = urllib2.urlopen(req, timeout=5)
|
||||||
|
except (urllib2.HTTPError, urllib2.URLError) as e:
|
||||||
|
# logger.error('Error notifying SSO service: %s' % e.code, exc_info=sys.exc_info(), extra={'data': {'url': url}})
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if settings.DEBUG:
|
||||||
|
print conn.read()
|
||||||
|
|
||||||
update_service_groups.delay(user_id=user.id)
|
update_service_groups.delay(user_id=user.id)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user