Fix WS deauthenticate
Properly handle timezones in the WebSocket deauthenticate call. It also updates the example to handle auth, and pass the proper action in results. Change-Id: I7b3b38764e6d275f9c2b29c8a09a6a947bf9bebf
This commit is contained in:
parent
6b02c01345
commit
4d9b3c9141
@ -16,6 +16,11 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 1em;
|
padding: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#login {
|
||||||
|
background-color: #c7e8f2;
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
#queues {
|
#queues {
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
background-color: #bbb;
|
background-color: #bbb;
|
||||||
@ -38,7 +43,11 @@
|
|||||||
var project = 'cf38008b72d04b89a505b9d66d1d5768';
|
var project = 'cf38008b72d04b89a505b9d66d1d5768';
|
||||||
var client_id = '31209ff3-ba03-4cec-b4ca-655f4899f8f4';
|
var client_id = '31209ff3-ba03-4cec-b4ca-655f4899f8f4';
|
||||||
socket.onopen = function(evt) {
|
socket.onopen = function(evt) {
|
||||||
list_queues();
|
var node = document.createElement('div');
|
||||||
|
var msg = new Date().toUTCString();
|
||||||
|
msg += " Connection opened"
|
||||||
|
node.appendChild(document.createTextNode(msg));
|
||||||
|
$('#log').append(node);
|
||||||
}
|
}
|
||||||
socket.onmessage = function(evt) {
|
socket.onmessage = function(evt) {
|
||||||
var node = document.createElement('div');
|
var node = document.createElement('div');
|
||||||
@ -57,12 +66,44 @@
|
|||||||
} else if (action == 'message_list') {
|
} else if (action == 'message_list') {
|
||||||
var messages = data['body']['messages'];
|
var messages = data['body']['messages'];
|
||||||
display_messages(messages);
|
display_messages(messages);
|
||||||
} else if (action == 'queue_create' || action == 'queue_delete') {
|
} else if (action == 'queue_create' || action == 'queue_delete' || action == 'authenticate') {
|
||||||
list_queues();
|
list_queues();
|
||||||
} else if (action == 'message_post' || action == 'message_delete') {
|
} else if (action == 'message_post' || action == 'message_delete') {
|
||||||
list_messages();
|
list_messages();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
login = function(frm) {
|
||||||
|
var data = {
|
||||||
|
'auth': {
|
||||||
|
'identity': {
|
||||||
|
'methods': ['password'],
|
||||||
|
'password': {
|
||||||
|
'user': {
|
||||||
|
'name': frm['user'].value,
|
||||||
|
'domain': {'id': 'default'},
|
||||||
|
'password': frm['password'].value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
'type': 'POST',
|
||||||
|
'url': 'http://localhost:5000/v3/auth/tokens',
|
||||||
|
'data': JSON.stringify(data),
|
||||||
|
'contentType': 'application/json',
|
||||||
|
'dataType': 'json',
|
||||||
|
'success': function(data, code, response) {
|
||||||
|
var token = response.getResponseHeader('X-Subject-Token')
|
||||||
|
var msg = {'action': 'authenticate',
|
||||||
|
'headers': {'X-Auth-Token': token,
|
||||||
|
'Client-ID': client_id,
|
||||||
|
'X-Project-ID': project}}
|
||||||
|
socket.send(JSON.stringify(msg));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
send_message = function(action, body) {
|
send_message = function(action, body) {
|
||||||
var msg = {'action': action,
|
var msg = {'action': action,
|
||||||
'headers': {'Client-ID': client_id, 'X-Project-ID': project}}
|
'headers': {'Client-ID': client_id, 'X-Project-ID': project}}
|
||||||
@ -122,12 +163,22 @@
|
|||||||
<h1>Zaqar WebSocket example</h1>
|
<h1>Zaqar WebSocket example</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id='login'>
|
||||||
|
<form class='pure-form' onsubmit='return login(this)'>
|
||||||
|
<fieldset>
|
||||||
|
<input type='text' name='user' placeholder='User' />
|
||||||
|
<input type='password' name='password' placeholder='Password' />
|
||||||
|
<button class='pure-button' type='submit'>Login</button>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class='pure-g'>
|
<div class='pure-g'>
|
||||||
<div id='queues' class='pure-u-1-3'>
|
<div id='queues' class='pure-u-1-3'>
|
||||||
<h4>Queues</h4>
|
<h4>Queues</h4>
|
||||||
<form class='pure-form' onsubmit='return create_queue(this)'>
|
<form class='pure-form' onsubmit='return create_queue(this)'>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<input type='text' name='queue' />
|
<input type='text' name='queue' placeholder='Queue name' />
|
||||||
<button class='pure-button' type='submit'>Create</button>
|
<button class='pure-button' type='submit'>Create</button>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
@ -145,8 +196,8 @@
|
|||||||
<h4>Messages</h4>
|
<h4>Messages</h4>
|
||||||
<form class='pure-form' onsubmit='return queue_message(this)'>
|
<form class='pure-form' onsubmit='return queue_message(this)'>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<input type='text' name='body' />
|
<input type='text' name='body' placeholder='Message body' />
|
||||||
<input type='text' name='ttl' size='5' value='3600' />
|
<input type='text' name='ttl' size='5' value='3600' placeholder='TTL' />
|
||||||
<button type='submit' class='pure-button'>Post</button>
|
<button type='submit' class='pure-button'>Post</button>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
|
@ -89,6 +89,7 @@ class AuthTest(base.V1_1Base):
|
|||||||
self.assertEqual(1, msg_mock.call_count)
|
self.assertEqual(1, msg_mock.call_count)
|
||||||
resp = json.loads(msg_mock.call_args[0][0])
|
resp = json.loads(msg_mock.call_args[0][0])
|
||||||
self.assertEqual(resp['headers']['status'], 401)
|
self.assertEqual(resp['headers']['status'], 401)
|
||||||
|
self.assertEqual(resp['request']['action'], 'authenticate')
|
||||||
|
|
||||||
def test_reauth(self):
|
def test_reauth(self):
|
||||||
headers = self.headers.copy()
|
headers = self.headers.copy()
|
||||||
|
@ -23,8 +23,6 @@ import pytz
|
|||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
_EPOCH = datetime.datetime(1970, 1, 1, tzinfo=pytz.UTC)
|
|
||||||
|
|
||||||
|
|
||||||
class MessagingProtocol(websocket.WebSocketServerProtocol):
|
class MessagingProtocol(websocket.WebSocketServerProtocol):
|
||||||
|
|
||||||
@ -76,7 +74,7 @@ class MessagingProtocol(websocket.WebSocketServerProtocol):
|
|||||||
if self._auth_strategy and not self._authentified:
|
if self._auth_strategy and not self._authentified:
|
||||||
if self._auth_app or payload.get('action') != 'authenticate':
|
if self._auth_app or payload.get('action') != 'authenticate':
|
||||||
body = {'error': 'Not authentified.'}
|
body = {'error': 'Not authentified.'}
|
||||||
resp = self._handler.create_response(403, body)
|
resp = self._handler.create_response(403, body, req)
|
||||||
else:
|
else:
|
||||||
return self._authenticate(payload)
|
return self._authenticate(payload)
|
||||||
elif payload.get('action') == 'authenticate':
|
elif payload.get('action') == 'authenticate':
|
||||||
@ -101,27 +99,29 @@ class MessagingProtocol(websocket.WebSocketServerProtocol):
|
|||||||
self._auth_app = None
|
self._auth_app = None
|
||||||
expire = env['keystone.token_info']['token']['expires_at']
|
expire = env['keystone.token_info']['token']['expires_at']
|
||||||
expire_time = timeutils.parse_isotime(expire)
|
expire_time = timeutils.parse_isotime(expire)
|
||||||
timestamp = (expire_time - _EPOCH).total_seconds()
|
now = datetime.datetime.now(tz=pytz.UTC)
|
||||||
|
delta = (expire_time - now).total_seconds()
|
||||||
if self._deauth_handle is not None:
|
if self._deauth_handle is not None:
|
||||||
self._deauth_handle.cancel()
|
self._deauth_handle.cancel()
|
||||||
self._deauth_handle = self._loop.call_at(
|
self._deauth_handle = self._loop.call_later(
|
||||||
timestamp, self._deauthenticate)
|
delta, self._deauthenticate)
|
||||||
|
|
||||||
start_response('200 OK', [])
|
start_response('200 OK', [])
|
||||||
|
|
||||||
def _deauthenticate(self):
|
def _deauthenticate(self):
|
||||||
self._authentified = False
|
self._authentified = False
|
||||||
self.sendClose(403, 'Authentication expired.')
|
self.sendClose(4003, u'Authentication expired.')
|
||||||
|
|
||||||
def _auth_response(self, status, message):
|
def _auth_response(self, status, message):
|
||||||
code = int(status.split()[0])
|
code = int(status.split()[0])
|
||||||
|
req = self._handler.create_request({'action': 'authenticate'})
|
||||||
if code != 200:
|
if code != 200:
|
||||||
body = {'error': 'Authentication failed.'}
|
body = {'error': 'Authentication failed.'}
|
||||||
resp = self._handler.create_response(code, body)
|
resp = self._handler.create_response(code, body, req)
|
||||||
self._send_response(resp)
|
self._send_response(resp)
|
||||||
else:
|
else:
|
||||||
body = {'message': 'Authentified.'}
|
body = {'message': 'Authentified.'}
|
||||||
resp = self._handler.create_response(200, body)
|
resp = self._handler.create_response(200, body, req)
|
||||||
self._send_response(resp)
|
self._send_response(resp)
|
||||||
|
|
||||||
def _header_to_env_var(self, key):
|
def _header_to_env_var(self, key):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user