diff --git a/backend-project/myui_backend/backend.py b/backend-project/myui_backend/backend.py index e27ea864463428ab31b725d98d1d352b1aab013a..37cdc86d177f8de3e1be5337fc9e0fa74b17ed05 100644 --- a/backend-project/myui_backend/backend.py +++ b/backend-project/myui_backend/backend.py @@ -12,8 +12,10 @@ from pyfcm import FCMNotification from json import dumps from rest_framework import viewsets from rest_framework.response import Response +from rest_framework import status +from rest_framework.decorators import api_view from django.shortcuts import HttpResponse -from django.conf import settings +from . import utils sample_json = {'ddp': [1,2,3,4,5], 'sda': {6,7,8,9,10}} @@ -26,25 +28,26 @@ class SampleViewSet(viewsets.ViewSet): } return Response(response) - -CLIENT_SECRET = getattr(settings, 'CLIENT_SECRET', '') -CLIENT_ID = getattr(settings, 'CLIENT_ID', '') -GRANT_TYPE = getattr(settings, 'GRANT_TYPE', '') -REDIRECTION_URL = getattr(settings, 'REDIRECTION_URL', '') -OAUTH_BASE_URL = getattr(settings, 'OAUTH_BASE_URL', '') -OAUTH_TOKEN = getattr(settings, 'OAUTH_TOKEN', '') - -def token(request, code): +@api_view() +def token(request): """ this service is used to get token from akun.cs.ui.ac.id """ - code = code - payloads = {'client_id' : CLIENT_ID, 'client_secret' : CLIENT_SECRET, 'grant_type' : GRANT_TYPE, 'redirect_uri' : \ - REDIRECTION_URL, 'code' : code} - req = requests.post('https://akun.cs.ui.ac.id/oauth/token/', data=payloads) + if 'state' and 'code' in request.GET: + code = request.GET.get('code') + r = utils.get_token(code) - return HttpResponse(dumps(req.json()), content_type="application/json") + return Response(data=r.json(), + status=r.status_code) + elif 'refresh_token' and 'client_id' in request.GET: + client_id = request.GET.get('client_id') + refresh_token = request.GET.get('refresh_token') + r = utils.renew_token(client_id, refresh_token) + return Response(data=r.json(), status=r.status_code) + else: + return Response(data={'error' : 'incomplete parameter'}, + status=status.HTTP_400_BAD_REQUEST) # implement your backend here @@ -58,3 +61,4 @@ def send_news(request, title, body): result = push_service.notify_topic_subscribers(topic_name=topic_name, message_title=message_title, message_body=message_body, message_icon="R.mipmap.ic_launcher_round") return HttpResponse("success") + diff --git a/backend-project/myui_backend/urls.py b/backend-project/myui_backend/urls.py index 2c4f8399359baf8f7417725d2b8d84b99cd80300..80f26690e0c540a5da64a5a6d2edac8117f7fccf 100644 --- a/backend-project/myui_backend/urls.py +++ b/backend-project/myui_backend/urls.py @@ -22,7 +22,7 @@ router = routers.SimpleRouter() router.register(r'sample',backend.SampleViewSet,base_name='sample') urlpatterns = [ - url(r'^token/(?P<code>[0-9]{4})/$', backend.token, name='token'), + url(r'^token/$', backend.token, name='token'), url(r'^docs/', include_docs_urls(title='MyUI Staff API', description="API yang digunakan oleh aplikasi mobile MyUI-Staff")), url(r'send_news/(?P<title>[a-zA-Z0-9]*)/(?P<body>[a-zA-Z0-9]*)$', backend.send_news, name='send-news'), diff --git a/backend-project/myui_backend/utils.py b/backend-project/myui_backend/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..3659f226078705d1fa0136e6f2de20152b1fdca9 --- /dev/null +++ b/backend-project/myui_backend/utils.py @@ -0,0 +1,33 @@ +import requests +from django.conf import settings + +CLIENT_SECRET = getattr(settings, 'CLIENT_SECRET', '') +CLIENT_ID = getattr(settings, 'CLIENT_ID', '') +AUTHORIZATION_CODE_GRANT_TYPE = getattr(settings, 'AUTHORIZATION_CODE_GRANT_TYPE', '') +REDIRECT_URL = getattr(settings, 'REDIRECT_URL', '') +OAUTH_BASE_URL = getattr(settings, 'OAUTH_BASE_URL', '') +OAUTH_ACCESS_TOKEN_URL = getattr(settings, 'OAUTH_ACCESS_TOKEN_URL', '') + + +def get_token(authorization_code): + """ + this function is used to get token from akun.cs.ui.ac.id + """ + + payloads = {'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'grant_type': AUTHORIZATION_CODE_GRANT_TYPE, 'redirect_uri': \ + REDIRECT_URL, 'code': authorization_code} + print payloads + response = requests.post(OAUTH_ACCESS_TOKEN_URL, data=payloads) + + return response + + +def renew_token(client_id, refresh_token): + """ + this function is used to renew token from akun.cs.ui.ac.id + """ + + payloads = {'client_id': client_id, 'grant_type': 'refresh_token', 'refresh_token': refresh_token} + response = requests.post(OAUTH_ACCESS_TOKEN_URL, data=payloads) + + return response \ No newline at end of file diff --git a/backend-project/myui_backend_project/settings.py b/backend-project/myui_backend_project/settings.py index 7f8fdd81864c637e4bd3c883bd9b995a08930884..49821ea443962777ab0e3a930f0f888c5f4552dc 100644 --- a/backend-project/myui_backend_project/settings.py +++ b/backend-project/myui_backend_project/settings.py @@ -23,16 +23,21 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY = 'y1nw-!%4p&sj18z1^v5f)eyntcjenn+z5b%20qjc=32kqjyqo+' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True + + +PRODUCTION = BASE_DIR.__contains__('myui.cs.ui.ac.id') +STAGING = BASE_DIR.__contains__('myui-dev.cs.ui.ac.id') + +DEBUG = not (PRODUCTION or STAGING) ALLOWED_HOSTS = ['*'] CLIENT_ID = '2bfJDNTlHhR9TJO6kQ5OsINqeMpNqFrudWOC8Vg9'#os.environ.get('CLIENT_ID') CLIENT_SECRET = 'hUgmknnh2hFiowr8KYMyJUSt5JR5qjzJZydCATRYTPpCyBnub4FmBO15OwFqC9qEILcKmfq2uVp305XBJiapMt23ZpUBJnBlfsoXJZx1A8XbPaS5DU8Z4pYTe0cQo1ZN'#os.environ.get('CLIENT_SECRET') -REDIRECTION_URL = 'akuncs://localhost/'#os.environ.get('REDIRECTION_URL') -GRANT_TYPE = 'authorization_code'#os.environ.get('GRANT_TYPE') -OAUTH_BASE_URL = 'https://akun.cs.ui.ac.id/'#os.environ.get('OAUTH_BASE_URL') -OAUTH_TOKEN = 'oauth/token'#os.environ.get('OAUTH_TOKEN') + +REDIRECT_URL = 'http://152.118.29.42:7000/backend/token/' #os.environ.get('REDIRECTION_URL') +AUTHORIZATION_CODE_GRANT_TYPE = 'authorization_code'#os.environ.get('GRANT_TYPE') +OAUTH_ACCESS_TOKEN_URL = 'https://akun.cs.ui.ac.id/oauth/token/' # Application definition @@ -82,22 +87,36 @@ WSGI_APPLICATION = 'myui_backend_project.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases - -DATABASES = { - # 'default': { - # 'ENGINE': 'django.db.backends.postgresql_psycopg2', - # 'NAME': 'myproject', - # 'USER': 'myprojectuser', - # 'PASSWORD': 'password', - # 'HOST': 'localhost', - # 'PORT': '', - # } - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), +if PRODUCTION: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': os.getenv('PRODUCTION_DB_NAME'), + 'USER': os.getenv('PRODUCTION_DB_USER'), + 'PASSWORD': os.getenv('PRODUCTION_DB_PASSWORD'), + 'HOST': os.getenv('PRODUCTION_DB_HOST') + } + } +elif STAGING: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': os.getenv('STAGING_DB_NAME'), + 'USER': os.getenv('STAGING_DB_USER'), + 'PASSWORD': os.getenv('STAGING_DB_PASSWORD'), + 'HOST': os.getenv('STAGING_DB_HOST') + } + } +else: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } } -} +if PRODUCTION or STAGING: + STATIC_ROOT = os.path.join(BASE_DIR, '../static') # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators diff --git a/backend-project/requirement.txt b/backend-project/requirement.txt index 36a5174a511ce0a989b56b25925bc36103cc5cae..15a9ee5d56b511e4209bd428b174bd8b431cccd9 100644 --- a/backend-project/requirement.txt +++ b/backend-project/requirement.txt @@ -5,13 +5,18 @@ coreschema==0.0.4 Django==1.11.3 django-filter==1.0.4 djangorestframework==3.6.3 +fcm-django==0.2.11 idna==2.5 itypes==1.1.0 Jinja2==2.9.6 Markdown==2.6.8 MarkupSafe==1.0 +psycopg2==2.7.3 +pyfcm==1.3.1 pytz==2017.2 requests==2.18.2 +requests-mock==1.3.0 +requests-toolbelt==0.8.0 +six==1.10.0 uritemplate==3.0.0 urllib3==1.22 -request-mock