From f27461df08bed02cdb8f95b828316a63751bb3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 16 Mar 2022 11:29:00 +0100 Subject: [PATCH] backends: Add MusicBrainz OAuth2 --- social_core/backends/musicbrainz.py | 28 +++++++++++++++++++ .../tests/backends/test_musicbrainz.py | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 social_core/backends/musicbrainz.py create mode 100644 social_core/tests/backends/test_musicbrainz.py diff --git a/social_core/backends/musicbrainz.py b/social_core/backends/musicbrainz.py new file mode 100644 index 00000000..940407e1 --- /dev/null +++ b/social_core/backends/musicbrainz.py @@ -0,0 +1,28 @@ +from social_core.backends.oauth import BaseOAuth2 + +class MusicBrainzOAuth2(BaseOAuth2): + """MusicBrainz OAuth authentication backend""" + name = 'musicbrainz' + AUTHORIZATION_URL = 'https://musicbrainz.org/oauth2/authorize' + ACCESS_TOKEN_URL = 'https://musicbrainz.org/oauth2/token' + ACCESS_TOKEN_METHOD = 'POST' + ID_KEY = 'metabrainz_user_id' + DEFAULT_SCOPE = ['profile', 'email'] + SCOPE_SEPARATOR = ' ' + REDIRECT_STATE = False + EXTRA_DATA = [ + ('metabrainz_user_id', 'id'), + ('expires_in', 'expires'), + ] + + def get_user_details(self, response): + """Return user details from MusicBrainz account""" + return {'username': response.get('sub'), + 'email': response.get('email') or '', + 'first_name': response.get('sub')} + + def user_data(self, access_token, *args, **kwargs): + """Loads user data from service""" + return self.get_json('https://musicbrainz.org/oauth2/userinfo', params={ + 'access_token': access_token + }) diff --git a/social_core/tests/backends/test_musicbrainz.py b/social_core/tests/backends/test_musicbrainz.py new file mode 100644 index 00000000..bc464643 --- /dev/null +++ b/social_core/tests/backends/test_musicbrainz.py @@ -0,0 +1,28 @@ +import json + +from httpretty import HTTPretty + +from ...exceptions import AuthFailed +from .oauth import OAuth2Test + + +class MusicBrainzAuth2Test(OAuth2Test): + backend_path = 'social_core.backends.musicbrainz.MusicBrainzOAuth2' + user_data_url = 'https://musicbrainz.org/oauth2/userinfo' + expected_username = 'foobar' + access_token_body = json.dumps({ + 'access_token': 'GjtKfJS6G4lupbQcCOiTKo4HcLXUgI1p', + 'expires_in': 3600, + 'token_type': 'Bearer', + 'refresh_token': 'GjSCBBjp4fnbE0AKo3uFu9qq9K2fFm4u' + }) + user_data_body = json.dumps({ + 'sub': 'foobar', + 'email': 'foo@bar.com', + }) + + def test_login(self): + self.do_login() + + def test_partial_pipeline(self): + self.do_partial_pipeline()