First working version of the shared web login.

This commit is contained in:
Griatch 2016-05-30 21:36:38 +02:00
parent 81170b69d0
commit a31441b3ce
9 changed files with 130 additions and 8 deletions

View file

@ -230,6 +230,7 @@ An "emitter" object must have a function
open = true;
ever_open = true;
Evennia.emit('connection_open', ["websocket"], event);
Evennia.msg('browser_sessid', [browser_sessid], {});
};
// Handle Websocket close event
websocket.onclose = function (event) {
@ -308,6 +309,7 @@ An "emitter" object must have a function
success: function(data) {
data = JSON.parse(data);
log ("connection_open", ["AJAX/COMET"], data);
Evennia.msg("browser_sessid", [browser_sessid], {});
client_hash = data.suid;
stop_polling = false;
poll();

View file

@ -35,6 +35,12 @@ JQuery available.
var wsactive = false;
{% endif %}
{% if browser_sessid %}
var browser_sessid = "{{browser_sessid}}";
{% else %}
var browser_sessid = false;
{% endif %}
{% if websocket_url %}
var wsurl = "{{websocket_url}}:{{websocket_port}}";
{% else %}

View file

@ -6,7 +6,9 @@ page and serve it eventual static content.
"""
from __future__ import print_function
from django.shortcuts import render
from django.contrib.auth import login
from evennia.server.sessionhandler import SESSION_HANDLER
from evennia.players.models import PlayerDB
@ -14,9 +16,31 @@ def webclient(request):
"""
Webclient page template loading.
"""
print ("webclient session:", request.session.session_key, request.user, request.user.is_authenticated())
nsess = len(PlayerDB.objects.get_connected_players()) or "none"
# as an example we send the number of connected players to the template
pagevars = {'num_players_connected': nsess}
browser_session = request.session
browserid = request.session.session_key
player = request.user
# check if user has authenticated to website
if player.is_authenticated():
print ("webclient: player auth, trying to connect sessions")
# Try to login all the player's webclient sessions - only
# unloggedin ones will actually be logged in.
for session in SESSION_HANDLER.sessions_from_browserid(browserid):
print ("session to connect:", session)
if session.protocol_key in ("websocket", "ajax/comet"):
SESSION_HANDLER.login(session, player)
session.browserid = browser_session.session_key
browser_session["logged_in"] = player.id
elif browser_session.get("logged_in"):
# The webclient has previously registered a login to this browser_session
print ("webclient: browser_session logged in, trying to login")
player = PlayerDB.objects.get(browser_session.get("uid"))
login(player, request)
else:
browser_session["logged_in"] = False
# make sure to store the browser session's hash so the webclient can get to it
pagevars = {'browser_sessid': request.session.session_key}
return render(request, 'webclient.html', pagevars)

View file

@ -14,6 +14,8 @@ from evennia import SESSION_HANDLER
from evennia.objects.models import ObjectDB
from evennia.players.models import PlayerDB
from django.contrib.auth import login
_BASE_CHAR_TYPECLASS = settings.BASE_CHARACTER_TYPECLASS
@ -21,6 +23,33 @@ def page_index(request):
"""
Main root page.
"""
# handle webclient-website shared login
browser_session = request.session
browserid = request.session.session_key
player = request.user
# check if user has authenticated to website
if player.is_authenticated():
# Try to login all the player's webclient sessions - only
# unloggedin ones will actually be logged in.
print "website: player auth, trying to connect sessions"
for session in SESSION_HANDLER.sessions_from_browserid(browserid):
print "session to connect:", session
if session.protocol_key in ("websocket", "ajax/comet"):
SESSION_HANDLER.login(session, player)
session.browserid = browser_session.session_key
browser_session["logged_in"] = player.id
elif browser_session.get("logged_in"):
# The webclient has previously registered a login to this browser_session
print "website: browser_session logged in, trying to login"
player = PlayerDB.objects.get(id=browser_session.get("logged_in"))
login(request, player)
else:
browser_session["logged_in"] = None
print ("website session:", request.session.session_key, request.user, request.user.is_authenticated())
# Some misc. configurable stuff.
# TODO: Move this to either SQL or settings.py based configuration.
fpage_player_limit = 4