diff --git a/README.md b/README.md index 242f912..5748fd6 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ Connections that Authlib Loginpass contains: - [x] Yandex - [x] Twitch - [x] VK +- [x] B2Access Usage ----- diff --git a/loginpass/__init__.py b/loginpass/__init__.py index 70c29fc..bf498b1 100644 --- a/loginpass/__init__.py +++ b/loginpass/__init__.py @@ -23,12 +23,13 @@ from .twitch import Twitch from .vk import VK from .orcid import ORCiD +from .b2access import B2Access, B2AccessDev, create_b2access_backend OAUTH_BACKENDS = [ BattleNet, Twitter, Facebook, Google, GitHub, Dropbox, Instagram, Reddit, Gitlab, Slack, Discord, StackOverflow, Bitbucket, Strava, Spotify, Yandex, - Twitch, VK, + Twitch, VK, B2Access ] __all__ = [ @@ -56,6 +57,7 @@ 'VK', 'ORCiD', 'OAUTH_BACKENDS', + 'B2Access','B2AccessDev','create_b2access_backend', ] __version__ = version diff --git a/loginpass/b2access.py b/loginpass/b2access.py new file mode 100644 index 0000000..c29fc51 --- /dev/null +++ b/loginpass/b2access.py @@ -0,0 +1,57 @@ +""" + loginpass.b2access + ~~~~~~~~~~~~~~~~ + Loginpass Backend of B2ACCESS + + gets endpoint from B2ACCESS_API_URL environment variable, if not specified, default development url is used + + development: https://unity.eudat-aai.fz-juelich.de/ + production: https://b2access.eudat.eu). + + :copyright: (c) 2019 by Tomas Kulhanek, ESDF + :license: MIT, see LICENSE for more details. + +""" + +from loginpass._core import UserInfo, OAuthBackend +import os + +#Authorization Grant https://unity.eudat-aai.fz-juelich.de:443/oauth2-as/oauth2-authz https://b2access.eudat.eu:443/oauth2-as/oauth2-authz +#Access Token https://unity.eudat-aai.fz-juelich.de:443/oauth2/token https://b2access.eudat.eu:443/oauth2/token +#Token Information/validation https://unity.eudat-aai.fz-juelich.de:443/oauth2 /tokeninfo https://b2access.eudat.eu:443/oauth2/tokeninfo +#User information https://unity.eudat-aai.fz-juelich.de:443/oauth2/userinfo https://b2access.eudat.eu:443/oauth2/userinfo + +# development endpoint + +def create_b2access_backend(name,b2accessurl): + B2ACCESS_API_URL = b2accessurl.strip('/') + B2ACCESS_TOKEN_URL = '{b2accessurl}/oauth2/token'.format(b2accessurl=b2accessurl) + B2ACCESS_TOKENINFO_URL = '{b2accessurl}/oauth2/tokeninfo'.format(b2accessurl=b2accessurl) + B2ACCESS_AUTH_URL = '{b2accessurl}/oauth2-as/oauth2-authz'.format(b2accessurl=b2accessurl) + B2ACCESS_USERINFO_SUFFIX='/oauth2/userinfo' + B2ACCESS_USERINFO_URL = '{b2accessurl}/oauth2/userinfo'.format(b2accessurl=b2accessurl) + + class B2AccessAuth(OAuthBackend): + OAUTH_TYPE = '2.0,oidc' + OAUTH_NAME = 'b2access' + OAUTH_CONFIG = { + 'api_base_url': B2ACCESS_API_URL, + 'access_token_url': B2ACCESS_TOKEN_URL, + 'authorize_url': B2ACCESS_AUTH_URL, + 'client_kwargs': {'scope': 'email profile'}, + } + + def profile(self, **kwargs): + print('b2access profile kwargs:',kwargs) + resp = self.get(B2ACCESS_USERINFO_SUFFIX,**kwargs) + data = resp.json() + params = { + 'sub': data['sub'], + 'name': data['name'], + 'email': data['email'], + } + return UserInfo(params) + return B2AccessAuth + +B2Access = create_b2access_backend('b2access','https://b2access.eudat.eu') +B2AccessDev = create_b2access_backend('b2access','https://unity.eudat-aai.fz-juelich.de') diff --git a/tests/data/b2access/01_response.json b/tests/data/b2access/01_response.json new file mode 100644 index 0000000..33f2ef6 --- /dev/null +++ b/tests/data/b2access/01_response.json @@ -0,0 +1,5 @@ +{ + "sub": "37198652-1231-e2e3435-1f231242350", + "name": "John Smith", + "email": "john.smith@example.com" +} \ No newline at end of file diff --git a/tests/data/b2access/result.json b/tests/data/b2access/result.json new file mode 100644 index 0000000..33f2ef6 --- /dev/null +++ b/tests/data/b2access/result.json @@ -0,0 +1,5 @@ +{ + "sub": "37198652-1231-e2e3435-1f231242350", + "name": "John Smith", + "email": "john.smith@example.com" +} \ No newline at end of file diff --git a/tests/test_oauth_backends.py b/tests/test_oauth_backends.py index 583b06f..295893d 100644 --- a/tests/test_oauth_backends.py +++ b/tests/test_oauth_backends.py @@ -16,6 +16,7 @@ Gitlab, Strava, ORCiD, + B2Access ) @@ -97,3 +98,6 @@ def test_strava(self): def test_orcid(self): self.run_oauth_profile(ORCiD) + + def test_b2access(self): + self.run_oauth_profile(B2Access)