Skip to content
Snippets Groups Projects
Commit d81ccef2 authored by jan.bednarik's avatar jan.bednarik
Browse files

Login by shortcut WIP.

parent 954ffb13
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,7 @@ from flask import g ...@@ -3,6 +3,7 @@ from flask import g
import graphene import graphene
from graphene import relay from graphene import relay
from graphene.types.datetime import DateTime from graphene.types.datetime import DateTime
from graphql_relay import from_global_id
from oic.oic import rndstr from oic.oic import rndstr
from oic.oic.message import AuthorizationResponse from oic.oic.message import AuthorizationResponse
import time import time
...@@ -13,9 +14,16 @@ from .auth import ( ...@@ -13,9 +14,16 @@ from .auth import (
get_session_expiration_time, get_session_expiration_time,
create_access_token, create_access_token,
) )
from .documents import UserDoc, LoginAttemptDoc, SessionDoc, ReportDoc from .documents import (
UserDoc,
LoginAttemptDoc,
SessionDoc,
ReportDoc,
OpenIdClientDoc,
)
from .openid import ( from .openid import (
init_client_for_uid, init_client_for_uid,
init_client_for_shortcut,
register_client, register_client,
get_authorization_url, get_authorization_url,
set_registration_info, set_registration_info,
...@@ -72,6 +80,59 @@ class Login(relay.ClientIDMutation): ...@@ -72,6 +80,59 @@ class Login(relay.ClientIDMutation):
return Login(authorization_url=authorization_url) return Login(authorization_url=authorization_url)
class LoginByShortcut(relay.ClientIDMutation):
class Input:
shortcut_id = relay.GlobalID(required=True)
redirect_uri = graphene.String(required=True)
authorization_url = graphene.String()
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
shortcut_id = input['shortcut_id']
redirect_uri = input['redirect_uri']
type, id = from_global_id(shortcut_id)
openid_client_data = OpenIdClientDoc.get(id, using=info.context['es'],
index=info.context['index'])
# prepare OpenID client
client = init_client_for_shortcut(openid_client_data, redirect_uri)
# TODO
"""
# prepare login attempt details
state = rndstr(32)
nonce = rndstr()
expiration = get_login_attempt_expiration_time()
# save login attempt into ES
data = {
'meta': {'id': client.client_id},
'state': state,
'nonce': nonce,
'client_id': client.client_id,
'client_secret': client.client_secret,
'openid_uid': openid_uid,
'redirect_uri': redirect_uri,
'expiration': expiration,
}
login_attempt = LoginAttemptDoc(**data)
login_attempt.save(using=info.context['es'], index=info.context['index'])
# already registered user?
user = UserDoc.get_by_openid_uid(openid_uid, **info.context)
is_new_user = user is None
# get OpenID authorization url
authorization_url = get_authorization_url(client, state, nonce, is_new_user)
"""
authorization_url = 'http://localhost/foo'
return LoginByShortcut(authorization_url=authorization_url)
class LoginRedirect(relay.ClientIDMutation): class LoginRedirect(relay.ClientIDMutation):
class Input: class Input:
...@@ -184,6 +245,7 @@ class NewReport(relay.ClientIDMutation): ...@@ -184,6 +245,7 @@ class NewReport(relay.ClientIDMutation):
class Mutation(graphene.ObjectType): class Mutation(graphene.ObjectType):
login = Login.Field() login = Login.Field()
login_by_shortcut = LoginByShortcut.Field()
login_redirect = LoginRedirect.Field() login_redirect = LoginRedirect.Field()
logout = Logout.Field() logout = Logout.Field()
new_report = NewReport.Field() new_report = NewReport.Field()
from oic.oic import Client from oic.oic import Client
from oic.oic.message import RegistrationResponse, ClaimsRequest, Claims from oic.oic.message import (
ProviderConfigurationResponse,
RegistrationResponse,
ClaimsRequest,
Claims,
)
from oic.utils.authn.client import CLIENT_AUTHN_METHOD from oic.utils.authn.client import CLIENT_AUTHN_METHOD
from .settings import SITE_NAME from .settings import SITE_NAME
...@@ -12,6 +17,19 @@ def init_client_for_uid(openid_uid): ...@@ -12,6 +17,19 @@ def init_client_for_uid(openid_uid):
return client return client
def init_client_for_shortcut(data, redirect_uri):
client = Client(client_authn_method=CLIENT_AUTHN_METHOD)
set_registration_info(client, data['client_id'], data['client_secret'], redirect_uri)
info = {
'issuer': data['issuer'],
'authorization_endpoint': data['authorization_endpoint'],
'token_endpoint': data['token_endpoint'],
'userinfo_endpoint': data['userinfo_endpoint'],
}
client.provider_info = ProviderConfigurationResponse(**info)
return client
def register_client(client, redirect_uri): def register_client(client, redirect_uri):
params = { params = {
'redirect_uris': [redirect_uri], 'redirect_uris': [redirect_uri],
......
...@@ -80,7 +80,7 @@ snapshots['test_create_index__check_mappings 1'] = { ...@@ -80,7 +80,7 @@ snapshots['test_create_index__check_mappings 1'] = {
'client_secret': { 'client_secret': {
'type': 'keyword' 'type': 'keyword'
}, },
'isShortcut': { 'is_shortcut': {
'type': 'boolean' 'type': 'boolean'
}, },
'issuer': { 'issuer': {
...@@ -89,9 +89,6 @@ snapshots['test_create_index__check_mappings 1'] = { ...@@ -89,9 +89,6 @@ snapshots['test_create_index__check_mappings 1'] = {
'name_x': { 'name_x': {
'type': 'keyword' 'type': 'keyword'
}, },
'redirect_uri': {
'type': 'keyword'
},
'token_endpoint': { 'token_endpoint': {
'type': 'keyword' 'type': 'keyword'
}, },
...@@ -208,7 +205,7 @@ snapshots['test_init_alias 1'] = { ...@@ -208,7 +205,7 @@ snapshots['test_init_alias 1'] = {
'client_secret': { 'client_secret': {
'type': 'keyword' 'type': 'keyword'
}, },
'isShortcut': { 'is_shortcut': {
'type': 'boolean' 'type': 'boolean'
}, },
'issuer': { 'issuer': {
...@@ -217,9 +214,6 @@ snapshots['test_init_alias 1'] = { ...@@ -217,9 +214,6 @@ snapshots['test_init_alias 1'] = {
'name_x': { 'name_x': {
'type': 'keyword' 'type': 'keyword'
}, },
'redirect_uri': {
'type': 'keyword'
},
'token_endpoint': { 'token_endpoint': {
'type': 'keyword' 'type': 'keyword'
}, },
...@@ -336,7 +330,7 @@ snapshots['test_reindex__check_new_index 1'] = { ...@@ -336,7 +330,7 @@ snapshots['test_reindex__check_new_index 1'] = {
'client_secret': { 'client_secret': {
'type': 'keyword' 'type': 'keyword'
}, },
'isShortcut': { 'is_shortcut': {
'type': 'boolean' 'type': 'boolean'
}, },
'issuer': { 'issuer': {
...@@ -345,9 +339,6 @@ snapshots['test_reindex__check_new_index 1'] = { ...@@ -345,9 +339,6 @@ snapshots['test_reindex__check_new_index 1'] = {
'name_x': { 'name_x': {
'type': 'keyword' 'type': 'keyword'
}, },
'redirect_uri': {
'type': 'keyword'
},
'token_endpoint': { 'token_endpoint': {
'type': 'keyword' 'type': 'keyword'
}, },
...@@ -464,7 +455,7 @@ snapshots['test_init_documents 1'] = { ...@@ -464,7 +455,7 @@ snapshots['test_init_documents 1'] = {
'client_secret': { 'client_secret': {
'type': 'keyword' 'type': 'keyword'
}, },
'isShortcut': { 'is_shortcut': {
'type': 'boolean' 'type': 'boolean'
}, },
'issuer': { 'issuer': {
...@@ -473,9 +464,6 @@ snapshots['test_init_documents 1'] = { ...@@ -473,9 +464,6 @@ snapshots['test_init_documents 1'] = {
'name_x': { 'name_x': {
'type': 'keyword' 'type': 'keyword'
}, },
'redirect_uri': {
'type': 'keyword'
},
'token_endpoint': { 'token_endpoint': {
'type': 'keyword' 'type': 'keyword'
}, },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment