mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-23 07:46:23 -04:00
Created api_key_api_client.
Implementation of create, revoke and show api keys for service. These calls work, however we still need to fix the tests.
This commit is contained in:
@@ -8,6 +8,7 @@ from flask_login import LoginManager
|
|||||||
from flask_wtf import CsrfProtect
|
from flask_wtf import CsrfProtect
|
||||||
from werkzeug.exceptions import abort
|
from werkzeug.exceptions import abort
|
||||||
from app.notify_client.api_client import NotificationsAdminAPIClient
|
from app.notify_client.api_client import NotificationsAdminAPIClient
|
||||||
|
from app.notify_client.api_key_api_client import ApiKeyApiClient
|
||||||
from app.notify_client.user_api_client import UserApiClient
|
from app.notify_client.user_api_client import UserApiClient
|
||||||
from app.its_dangerous_session import ItsdangerousSessionInterface
|
from app.its_dangerous_session import ItsdangerousSessionInterface
|
||||||
import app.proxy_fix
|
import app.proxy_fix
|
||||||
@@ -20,6 +21,7 @@ csrf = CsrfProtect()
|
|||||||
|
|
||||||
notifications_api_client = NotificationsAdminAPIClient()
|
notifications_api_client = NotificationsAdminAPIClient()
|
||||||
user_api_client = UserApiClient()
|
user_api_client = UserApiClient()
|
||||||
|
api_key_api_client = ApiKeyApiClient()
|
||||||
|
|
||||||
|
|
||||||
def create_app(config_name, config_overrides=None):
|
def create_app(config_name, config_overrides=None):
|
||||||
@@ -34,6 +36,7 @@ def create_app(config_name, config_overrides=None):
|
|||||||
|
|
||||||
notifications_api_client.init_app(application)
|
notifications_api_client.init_app(application)
|
||||||
user_api_client.init_app(application)
|
user_api_client.init_app(application)
|
||||||
|
api_key_api_client.init_app(application)
|
||||||
|
|
||||||
login_manager.init_app(application)
|
login_manager.init_app(application)
|
||||||
login_manager.login_view = 'main.sign_in'
|
login_manager.login_view = 'main.sign_in'
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from flask import request, render_template, redirect, url_for, flash
|
|||||||
from flask_login import login_required
|
from flask_login import login_required
|
||||||
from app.main import main
|
from app.main import main
|
||||||
from app.main.forms import CreateKeyForm
|
from app.main.forms import CreateKeyForm
|
||||||
|
from app import api_key_api_client
|
||||||
|
|
||||||
|
|
||||||
@main.route("/services/<int:service_id>/documentation")
|
@main.route("/services/<int:service_id>/documentation")
|
||||||
@@ -16,15 +17,7 @@ def api_keys(service_id):
|
|||||||
return render_template(
|
return render_template(
|
||||||
'views/api-keys.html',
|
'views/api-keys.html',
|
||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
keys=[
|
keys=api_key_api_client.get_api_keys(service_id=service_id)['apiKeys']
|
||||||
{'name': 'Test key 1', 'last_used': '12 January 2016, 10:01AM', 'id': 1},
|
|
||||||
{'name': 'Test key 2', 'last_used': '12 January 2016, 9:50AM', 'id': 1},
|
|
||||||
{'name': 'Test key 3', 'last_used': '12 January 2016, 9:49AM', 'id': 1},
|
|
||||||
{
|
|
||||||
'name': 'My first key', 'last_used': '25 December 2015, 09:49AM', 'id': 1,
|
|
||||||
'revoked': '4 January 2016, 6:00PM'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -33,7 +26,9 @@ def api_keys(service_id):
|
|||||||
def create_api_key(service_id):
|
def create_api_key(service_id):
|
||||||
form = CreateKeyForm()
|
form = CreateKeyForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
return redirect(url_for('.show_api_key', service_id=service_id))
|
secret = api_key_api_client.create_api_key(service_id=service_id, key_name=form.key_name.data)
|
||||||
|
return render_template('views/api-keys/show.html', service_id=service_id, secret=secret,
|
||||||
|
key_name=form.key_name.data)
|
||||||
return render_template(
|
return render_template(
|
||||||
'views/api-keys/create.html',
|
'views/api-keys/create.html',
|
||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
@@ -53,5 +48,6 @@ def revoke_api_key(service_id, key_id):
|
|||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
return render_template('views/api-keys/revoke.html', service_id=service_id)
|
return render_template('views/api-keys/revoke.html', service_id=service_id)
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
|
api_key_api_client.revoke_api_key(service_id=service_id, key_id=key_id)
|
||||||
flash('‘Test key 1’ was revoked')
|
flash('‘Test key 1’ was revoked')
|
||||||
return redirect(url_for('.api_keys', service_id=service_id))
|
return redirect(url_for('.api_keys', service_id=service_id))
|
||||||
|
|||||||
24
app/notify_client/api_key_api_client.py
Normal file
24
app/notify_client/api_key_api_client.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from client.base import BaseAPIClient
|
||||||
|
|
||||||
|
|
||||||
|
class ApiKeyApiClient(BaseAPIClient):
|
||||||
|
def __init__(self, base_url=None, client_id=None, secret=None):
|
||||||
|
super(self.__class__, self).__init__(base_url=base_url or 'base_url',
|
||||||
|
client_id=client_id or 'client_id',
|
||||||
|
secret=secret or 'secret')
|
||||||
|
|
||||||
|
def init_app(self, app):
|
||||||
|
self.base_url = app.config['API_HOST_NAME']
|
||||||
|
self.client_id = app.config['ADMIN_CLIENT_USER_NAME']
|
||||||
|
self.secret = app.config['ADMIN_CLIENT_SECRET']
|
||||||
|
|
||||||
|
def get_api_keys(self, service_id, *params):
|
||||||
|
return self.get(url='/service/{}/api-keys'.format(service_id))
|
||||||
|
|
||||||
|
def create_api_key(self, service_id, key_name, *params):
|
||||||
|
data = {"name": key_name}
|
||||||
|
key = self.post(url='/service/{}/api-key'.format(service_id), data=data)
|
||||||
|
return key['data']
|
||||||
|
|
||||||
|
def revoke_api_key(self, service_id, key_id, *params):
|
||||||
|
return self.post(url='/service/{0}/api-key/revoke/{1}'.format(service_id, key_id), data=None)
|
||||||
@@ -35,21 +35,18 @@
|
|||||||
empty_message="You haven’t created any API keys yet",
|
empty_message="You haven’t created any API keys yet",
|
||||||
caption="API keys",
|
caption="API keys",
|
||||||
caption_visible=False,
|
caption_visible=False,
|
||||||
field_headings=['Key name', 'Created at', hidden_field_heading('Action')]
|
field_headings=['Key name', hidden_field_heading('Action')]
|
||||||
) %}
|
) %}
|
||||||
{% call field() %}
|
{% call field() %}
|
||||||
{{ item.name }}
|
{{ item.name }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
{% call field() %}
|
{% if item.expiry_date %}
|
||||||
{{ item.last_used }}
|
|
||||||
{% endcall %}
|
|
||||||
{% if item.revoked %}
|
|
||||||
{% call field(align='right', status='default') %}
|
{% call field(align='right', status='default') %}
|
||||||
Revoked {{ item.revoked }}
|
Revoked {{ item.expiry_date }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% call field(align='right', status='error') %}
|
{% call field(align='right', status='error') %}
|
||||||
<a href='{{ url_for('.revoke_api_key', service_id=123, key_id=item.id) }}'>Revoke</a>
|
<a href='{{ url_for('.revoke_api_key', service_id=service_id, key_id=item.id) }}'>Revoke</a>
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
once you leave this page.
|
once you leave this page.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{{ api_key('d30512af92e1386d63b90e5973b49a10', 'CRM application') }}
|
{{ api_key(secret, key_name) }}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -210,3 +210,7 @@ def mock_register_user(mocker, user_data):
|
|||||||
mock_class = mocker.patch('app.user_api_client.register_user')
|
mock_class = mocker.patch('app.user_api_client.register_user')
|
||||||
mock_class.return_value = user
|
mock_class.return_value = user
|
||||||
return mock_class
|
return mock_class
|
||||||
|
|
||||||
|
|
||||||
|
def mock_create_api_key(mocker, key_name):
|
||||||
|
mock_class = mocker.patch('app.api')
|
||||||
|
|||||||
Reference in New Issue
Block a user