Configure LMS to select oauth2 providing library.
Available backends: * django-oauth-toolkit (DOT) * django-oauth2-provider (DOP) * Use provided client ID to select backend for * AccessToken requests * third party auth-token exchange * Create adapters to isolate library-dependent functionality * Handle django-oauth-toolkit tokens in edX DRF authenticator class MA-1998 MA-2000
This commit is contained in:
7
lms/djangoapps/oauth_dispatch/adapters/__init__.py
Normal file
7
lms/djangoapps/oauth_dispatch/adapters/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
"""
|
||||
Adapters to provide a common interface to django-oauth2-provider (DOP) and
|
||||
django-oauth-toolkit (DOT).
|
||||
"""
|
||||
|
||||
from .dop import DOPAdapter
|
||||
from .dot import DOTAdapter
|
||||
70
lms/djangoapps/oauth_dispatch/adapters/dop.py
Normal file
70
lms/djangoapps/oauth_dispatch/adapters/dop.py
Normal file
@@ -0,0 +1,70 @@
|
||||
"""
|
||||
Adapter to isolate django-oauth2-provider dependencies
|
||||
"""
|
||||
|
||||
from provider.oauth2 import models
|
||||
from provider import constants, scope
|
||||
|
||||
|
||||
class DOPAdapter(object):
|
||||
"""
|
||||
Standard interface for working with django-oauth2-provider
|
||||
"""
|
||||
|
||||
backend = object()
|
||||
|
||||
def create_confidential_client(self, name, user, redirect_uri, client_id=None):
|
||||
"""
|
||||
Create an oauth client application that is confidential.
|
||||
"""
|
||||
return models.Client.objects.create(
|
||||
name=name,
|
||||
user=user,
|
||||
client_id=client_id,
|
||||
redirect_uri=redirect_uri,
|
||||
client_type=constants.CONFIDENTIAL,
|
||||
)
|
||||
|
||||
def create_public_client(self, name, user, redirect_uri, client_id=None):
|
||||
"""
|
||||
Create an oauth client application that is public.
|
||||
"""
|
||||
return models.Client.objects.create(
|
||||
name=name,
|
||||
user=user,
|
||||
client_id=client_id,
|
||||
redirect_uri=redirect_uri,
|
||||
client_type=constants.PUBLIC,
|
||||
)
|
||||
|
||||
def get_client(self, **filters):
|
||||
"""
|
||||
Get the oauth client application with the specified filters.
|
||||
|
||||
Wraps django's queryset.get() method.
|
||||
"""
|
||||
return models.Client.objects.get(**filters)
|
||||
|
||||
def get_client_for_token(self, token):
|
||||
"""
|
||||
Given an AccessToken object, return the associated client application.
|
||||
"""
|
||||
return token.client
|
||||
|
||||
def get_access_token(self, token_string):
|
||||
"""
|
||||
Given a token string, return the matching AccessToken object.
|
||||
"""
|
||||
return models.AccessToken.objects.get(token=token_string)
|
||||
|
||||
def normalize_scopes(self, scopes):
|
||||
"""
|
||||
Given a list of scopes, return a space-separated list of those scopes.
|
||||
"""
|
||||
return ' '.join(scopes)
|
||||
|
||||
def get_token_scope_names(self, token):
|
||||
"""
|
||||
Given an access token object, return its scopes.
|
||||
"""
|
||||
return scope.to_names(token.scope)
|
||||
73
lms/djangoapps/oauth_dispatch/adapters/dot.py
Normal file
73
lms/djangoapps/oauth_dispatch/adapters/dot.py
Normal file
@@ -0,0 +1,73 @@
|
||||
"""
|
||||
Adapter to isolate django-oauth-toolkit dependencies
|
||||
"""
|
||||
|
||||
from oauth2_provider import models
|
||||
|
||||
|
||||
class DOTAdapter(object):
|
||||
"""
|
||||
Standard interface for working with django-oauth-toolkit
|
||||
"""
|
||||
|
||||
backend = object()
|
||||
|
||||
def create_confidential_client(self, name, user, redirect_uri, client_id=None):
|
||||
"""
|
||||
Create an oauth client application that is confidential.
|
||||
"""
|
||||
return models.Application.objects.create(
|
||||
name=name,
|
||||
user=user,
|
||||
client_id=client_id,
|
||||
client_type=models.Application.CLIENT_CONFIDENTIAL,
|
||||
authorization_grant_type=models.Application.GRANT_AUTHORIZATION_CODE,
|
||||
redirect_uris=redirect_uri,
|
||||
)
|
||||
|
||||
def create_public_client(self, name, user, redirect_uri, client_id=None):
|
||||
"""
|
||||
Create an oauth client application that is public.
|
||||
"""
|
||||
return models.Application.objects.create(
|
||||
name=name,
|
||||
user=user,
|
||||
client_id=client_id,
|
||||
client_type=models.Application.CLIENT_PUBLIC,
|
||||
authorization_grant_type=models.Application.GRANT_PASSWORD,
|
||||
redirect_uris=redirect_uri,
|
||||
)
|
||||
|
||||
def get_client(self, **filters):
|
||||
"""
|
||||
Get the oauth client application with the specified filters.
|
||||
|
||||
Wraps django's queryset.get() method.
|
||||
"""
|
||||
return models.Application.objects.get(**filters)
|
||||
|
||||
def get_client_for_token(self, token):
|
||||
"""
|
||||
Given an AccessToken object, return the associated client application.
|
||||
"""
|
||||
return token.application
|
||||
|
||||
def get_access_token(self, token_string):
|
||||
"""
|
||||
Given a token string, return the matching AccessToken object.
|
||||
"""
|
||||
return models.AccessToken.objects.get(token=token_string)
|
||||
|
||||
def normalize_scopes(self, scopes):
|
||||
"""
|
||||
Given a list of scopes, return a space-separated list of those scopes.
|
||||
"""
|
||||
if not scopes:
|
||||
scopes = ['default']
|
||||
return ' '.join(scopes)
|
||||
|
||||
def get_token_scope_names(self, token):
|
||||
"""
|
||||
Given an access token object, return its scopes.
|
||||
"""
|
||||
return list(token.scopes)
|
||||
Reference in New Issue
Block a user