92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
import requests
|
|
from urllib.parse import urlencode
|
|
|
|
from django.http import HttpResponseRedirect
|
|
from django.utils.translation import gettext as _
|
|
|
|
from allauth.socialaccount.providers.oauth.client import (
|
|
OAuthClient,
|
|
OAuthError,
|
|
get_token_prefix,
|
|
)
|
|
from allauth.utils import build_absolute_uri
|
|
|
|
|
|
class PocketOAuthClient(OAuthClient):
|
|
def _get_request_token(self):
|
|
"""
|
|
Obtain a temporary request token to authorize an access token and to
|
|
sign the request to obtain the access token
|
|
"""
|
|
if self.request_token is None:
|
|
redirect_url = build_absolute_uri(self.request, self.callback_url)
|
|
headers = {
|
|
"X-Accept": "application/json",
|
|
}
|
|
data = {
|
|
"consumer_key": self.consumer_key,
|
|
"redirect_uri": redirect_url,
|
|
}
|
|
response = requests.post(
|
|
url=self.request_token_url,
|
|
json=data,
|
|
headers=headers,
|
|
)
|
|
if response.status_code != 200:
|
|
raise OAuthError(
|
|
_("Invalid response while obtaining request token" ' from "%s".')
|
|
% get_token_prefix(self.request_token_url)
|
|
)
|
|
self.request_token = response.json()["code"]
|
|
self.request.session[
|
|
"oauth_%s_request_token" % get_token_prefix(self.request_token_url)
|
|
] = self.request_token
|
|
return self.request_token
|
|
|
|
def get_redirect(self, authorization_url, extra_params):
|
|
"""
|
|
Returns a ``HttpResponseRedirect`` object to redirect the user
|
|
to the Pocket authorization URL.
|
|
"""
|
|
request_token = self._get_request_token()
|
|
params = {
|
|
"request_token": request_token,
|
|
"redirect_uri": self.request.build_absolute_uri(self.callback_url),
|
|
}
|
|
params.update(extra_params)
|
|
url = authorization_url + "?" + urlencode(params)
|
|
return HttpResponseRedirect(url)
|
|
|
|
def get_access_token(self):
|
|
"""
|
|
Obtain the access token to access private resources at the API
|
|
endpoint.
|
|
"""
|
|
if self.access_token is None:
|
|
request_token = self._get_rt_from_session()
|
|
url = self.access_token_url
|
|
headers = {
|
|
"X-Accept": "application/json",
|
|
}
|
|
data = {
|
|
"consumer_key": self.consumer_key,
|
|
"code": request_token,
|
|
}
|
|
response = requests.post(url=url, headers=headers, json=data)
|
|
if response.status_code != 200:
|
|
raise OAuthError(
|
|
_("Invalid response while obtaining access token" ' from "%s".')
|
|
% get_token_prefix(self.request_token_url)
|
|
)
|
|
r = response.json()
|
|
self.access_token = {
|
|
"oauth_token": request_token,
|
|
"oauth_token_secret": r["access_token"],
|
|
"username": r["username"],
|
|
}
|
|
|
|
self.request.session[
|
|
"oauth_%s_access_token" % get_token_prefix(self.request_token_url)
|
|
] = self.access_token
|
|
return self.access_token
|