Merge pull request #323 from matteofuso/oauth-webbrowser-response
Fix OAuth callback server to return a response to the browser
This commit is contained in:
10
README.md
10
README.md
@@ -76,18 +76,22 @@ session = Session.Builder() \
|
|||||||
.create()
|
.create()
|
||||||
```
|
```
|
||||||
|
|
||||||
#### With auth url callback
|
#### With auth url callback and changing the content of the success page
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from librespot.core import Session
|
from librespot.core import Session
|
||||||
|
import webbrowser
|
||||||
|
|
||||||
# This will pass the auth url to the method
|
# This will pass the auth url to the method
|
||||||
|
|
||||||
def auth_url_callback(url):
|
def auth_url_callback(url):
|
||||||
print(url)
|
webbrowser.open(url)
|
||||||
|
|
||||||
|
# This is the response sent to the browser once the flow has been completed successfully
|
||||||
|
success_page = "<html><body><h1>Login Successful</h1><p>You can close this window now.</p><script>setTimeout(() => {window.close()}, 100);</script></body></html>"
|
||||||
|
|
||||||
session = Session.Builder() \
|
session = Session.Builder() \
|
||||||
.oauth(auth_url_callback) \
|
.oauth(auth_url_callback, success_page) \
|
||||||
.create()
|
.create()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1638,7 +1638,7 @@ class Session(Closeable, MessageListener, SubListener):
|
|||||||
pass
|
pass
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def oauth(self, oauth_url_callback) -> Session.Builder:
|
def oauth(self, oauth_url_callback, success_page_content = None) -> Session.Builder:
|
||||||
"""
|
"""
|
||||||
Login via OAuth
|
Login via OAuth
|
||||||
|
|
||||||
@@ -1647,7 +1647,7 @@ class Session(Closeable, MessageListener, SubListener):
|
|||||||
"""
|
"""
|
||||||
if os.path.isfile(self.conf.stored_credentials_file):
|
if os.path.isfile(self.conf.stored_credentials_file):
|
||||||
return self.stored_file(None)
|
return self.stored_file(None)
|
||||||
self.login_credentials = OAuth(MercuryRequests.keymaster_client_id, "http://127.0.0.1:5588/login", oauth_url_callback).flow()
|
self.login_credentials = OAuth(MercuryRequests.keymaster_client_id, "http://127.0.0.1:5588/login", oauth_url_callback).set_success_page_content(success_page_content).flow()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def user_pass(self, username: str, password: str) -> Session.Builder:
|
def user_pass(self, username: str, password: str) -> Session.Builder:
|
||||||
|
|||||||
@@ -22,11 +22,16 @@ class OAuth:
|
|||||||
__token = ""
|
__token = ""
|
||||||
__server = None
|
__server = None
|
||||||
__oauth_url_callback = None
|
__oauth_url_callback = None
|
||||||
|
__success_page_content = None
|
||||||
|
|
||||||
def __init__(self, client_id, redirect_url, oauth_url_callback):
|
def __init__(self, client_id, redirect_url, oauth_url_callback):
|
||||||
self.__client_id = client_id
|
self.__client_id = client_id
|
||||||
self.__redirect_url = redirect_url
|
self.__redirect_url = redirect_url
|
||||||
self.__oauth_url_callback = oauth_url_callback
|
self.__oauth_url_callback = oauth_url_callback
|
||||||
|
|
||||||
|
def set_success_page_content(self, content):
|
||||||
|
self.__success_page_content = content
|
||||||
|
return self
|
||||||
|
|
||||||
def __generate_generate_code_verifier(self):
|
def __generate_generate_code_verifier(self):
|
||||||
possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
||||||
@@ -76,9 +81,10 @@ class OAuth:
|
|||||||
class CallbackServer(HTTPServer):
|
class CallbackServer(HTTPServer):
|
||||||
callback_path = None
|
callback_path = None
|
||||||
|
|
||||||
def __init__(self, server_address, RequestHandlerClass, callback_path, set_code):
|
def __init__(self, server_address, RequestHandlerClass, callback_path, set_code, success_page_content):
|
||||||
self.callback_path = callback_path
|
self.callback_path = callback_path
|
||||||
self.set_code = set_code
|
self.set_code = set_code
|
||||||
|
self.success_page_content = success_page_content
|
||||||
super().__init__(server_address, RequestHandlerClass)
|
super().__init__(server_address, RequestHandlerClass)
|
||||||
|
|
||||||
class CallbackRequestHandler(BaseHTTPRequestHandler):
|
class CallbackRequestHandler(BaseHTTPRequestHandler):
|
||||||
@@ -86,12 +92,23 @@ class OAuth:
|
|||||||
if(self.path.startswith(self.server.callback_path)):
|
if(self.path.startswith(self.server.callback_path)):
|
||||||
query = urllib.parse.parse_qs(urlparse(self.path).query)
|
query = urllib.parse.parse_qs(urlparse(self.path).query)
|
||||||
if not query.__contains__("code"):
|
if not query.__contains__("code"):
|
||||||
|
self.send_response(400)
|
||||||
|
self.send_header('Content-type', 'text/html')
|
||||||
|
self.end_headers()
|
||||||
self.wfile.write(b"Request doesn't contain 'code'")
|
self.wfile.write(b"Request doesn't contain 'code'")
|
||||||
return
|
return
|
||||||
self.server.set_code(query.get("code")[0])
|
self.server.set_code(query.get("code")[0])
|
||||||
self.wfile.write(b"librespot-python received callback")
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'text/html')
|
||||||
|
self.end_headers()
|
||||||
|
success_page = self.server.success_page_content or "librespot-python received callback"
|
||||||
|
self.wfile.write(success_page.encode('utf-8'))
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Suppress logging
|
||||||
|
def log_message(self, format, *args) -> None:
|
||||||
|
return
|
||||||
|
|
||||||
def __start_server(self):
|
def __start_server(self):
|
||||||
try:
|
try:
|
||||||
self.__server.handle_request()
|
self.__server.handle_request()
|
||||||
@@ -106,7 +123,8 @@ class OAuth:
|
|||||||
(url.hostname, url.port),
|
(url.hostname, url.port),
|
||||||
self.CallbackRequestHandler,
|
self.CallbackRequestHandler,
|
||||||
url.path,
|
url.path,
|
||||||
self.set_code
|
self.set_code,
|
||||||
|
self.__success_page_content,
|
||||||
)
|
)
|
||||||
logging.info("OAuth: Waiting for callback on %s", url.hostname + ":" + str(url.port))
|
logging.info("OAuth: Waiting for callback on %s", url.hostname + ":" + str(url.port))
|
||||||
self.__start_server()
|
self.__start_server()
|
||||||
|
|||||||
Reference in New Issue
Block a user