From 68b7bb258915d509b7e43fe95099dd2430573e5c Mon Sep 17 00:00:00 2001 From: Juan Pablo Santos Date: Thu, 25 Dec 2014 21:57:24 -0500 Subject: [PATCH 1/3] Add preliminary OAuth1 support --- Network/Wreq/Internal.hs | 4 ++++ Network/Wreq/Internal/OAuth1.hs | 17 +++++++++++++++++ Network/Wreq/Internal/Types.hs | 1 + wreq.cabal | 2 ++ 4 files changed, 24 insertions(+) create mode 100644 Network/Wreq/Internal/OAuth1.hs diff --git a/Network/Wreq/Internal.hs b/Network/Wreq/Internal.hs index 344ff07..be5a10e 100644 --- a/Network/Wreq/Internal.hs +++ b/Network/Wreq/Internal.hs @@ -40,6 +40,7 @@ import qualified Network.HTTP.Client as HTTP import qualified Network.HTTP.Types as HTTP import qualified Network.Wreq.Internal.Lens as Lens import qualified Network.Wreq.Internal.AWS as AWS (signRequest) +import qualified Network.Wreq.Internal.OAuth1 as OAuth1 (signRequest) import qualified Network.Wreq.Lens as Lens hiding (checkStatus) -- This mess allows this module to continue to load during interactive @@ -117,8 +118,10 @@ prepare modify opts url = do signRequest = maybe return f $ auth opts where f (AWSAuth versn key secret) = AWS.signRequest versn key secret + f oauth1Credentials@(OAuth1 _ _ _ _) = OAuth1.signRequest oauth1Credentials f _ = return + setQuery :: Options -> Request -> Request setQuery opts = case params opts of @@ -136,6 +139,7 @@ setAuth = maybe id f . auth f (OAuth2Token token) = setHeader "Authorization" ("token " <> token) -- for AWS request signature, see Internal/AWS f (AWSAuth _ _ _) = id + f (OAuth1 _ _ _ _) = id setProxy :: Options -> Request -> Request setProxy = maybe id f . proxy diff --git a/Network/Wreq/Internal/OAuth1.hs b/Network/Wreq/Internal/OAuth1.hs new file mode 100644 index 0000000..8ee3dca --- /dev/null +++ b/Network/Wreq/Internal/OAuth1.hs @@ -0,0 +1,17 @@ +module Network.Wreq.Internal.OAuth1 + ( + signRequest + ) where + +import Network.HTTP.Client (Request(..)) +import Network.Wreq.Internal.Types (Auth(..)) +import Web.Authenticate.OAuth ( signOAuth, newOAuth, oauthConsumerKey + , oauthConsumerSecret, newCredential) + +signRequest :: Auth -> Request -> IO Request +signRequest (OAuth1 consumerToken consumerSecret token tokenSecret) requestToSign = signOAuth app creds requestToSign + where + app = newOAuth { oauthConsumerKey = consumerToken, oauthConsumerSecret = consumerSecret } + creds = newCredential token tokenSecret + +signRequest _ requestToSign = return requestToSign diff --git a/Network/Wreq/Internal/Types.hs b/Network/Wreq/Internal/Types.hs index 8465a9b..97ce97b 100644 --- a/Network/Wreq/Internal/Types.hs +++ b/Network/Wreq/Internal/Types.hs @@ -177,6 +177,7 @@ data Auth = BasicAuth S.ByteString S.ByteString | AWSAuth AWSAuthVersion S.ByteString S.ByteString -- ^ Amazon Web Services request signing -- AWSAuthVersion key secret + | OAuth1 S.ByteString S.ByteString S.ByteString S.ByteString deriving (Eq, Show, Typeable) data AWSAuthVersion = AWSv4 diff --git a/wreq.cabal b/wreq.cabal index f9c5a41..d69eece 100644 --- a/wreq.cabal +++ b/wreq.cabal @@ -80,6 +80,7 @@ library other-modules: Network.Wreq.Internal Network.Wreq.Internal.AWS + Network.Wreq.Internal.OAuth1 Network.Wreq.Internal.Lens Network.Wreq.Internal.Link Network.Wreq.Internal.Types @@ -90,6 +91,7 @@ library PSQueue >= 1.1, aeson >= 0.7.0.3, attoparsec >= 0.11.1.0, + authenticate-oauth == 1.5.*, base >= 4.5 && < 5, base16-bytestring, byteable, From b7bc8e4c09c013dcded729be7fe9c56db9fac5b7 Mon Sep 17 00:00:00 2001 From: Juan Pablo Santos Date: Thu, 25 Dec 2014 22:24:06 -0500 Subject: [PATCH 2/3] Correct oauth1 constructor --- Network/Wreq.hs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Network/Wreq.hs b/Network/Wreq.hs index ae49810..325d903 100644 --- a/Network/Wreq.hs +++ b/Network/Wreq.hs @@ -87,6 +87,7 @@ module Network.Wreq , AWSAuthVersion(..) , Lens.auth , basicAuth + , oauth1Auth , oauth2Bearer , oauth2Token , awsAuth @@ -460,6 +461,16 @@ basicAuth :: S.ByteString -- ^ Username. -> Auth basicAuth = BasicAuth +-- | OAuth1 authentication. This consists of a consumer token, +-- a consumer secret, a token and a token secret +oauth1Auth :: S.ByteString -- ^ Consumer token + -> S.ByteString -- ^ Consumer secret + -> S.ByteString -- ^ OAuth token + -> S.ByteString -- ^ OAuth token secret + -> Auth +oauth1Auth = OAuth1 + + -- | An OAuth2 bearer token. This is treated by many services as the -- equivalent of a username and password. -- From dceac69c99a190a136fb72f2d2e26e1b4d16742d Mon Sep 17 00:00:00 2001 From: Juan Pablo Santos Date: Mon, 23 Feb 2015 09:35:45 -0500 Subject: [PATCH 3/3] Unpack constructor before passing to signing function --- Network/Wreq/Internal.hs | 2 +- Network/Wreq/Internal/OAuth1.hs | 13 ++++--------- Network/Wreq/Internal/Types.hs | 2 ++ wreq.cabal | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Network/Wreq/Internal.hs b/Network/Wreq/Internal.hs index be5a10e..0887e68 100644 --- a/Network/Wreq/Internal.hs +++ b/Network/Wreq/Internal.hs @@ -118,7 +118,7 @@ prepare modify opts url = do signRequest = maybe return f $ auth opts where f (AWSAuth versn key secret) = AWS.signRequest versn key secret - f oauth1Credentials@(OAuth1 _ _ _ _) = OAuth1.signRequest oauth1Credentials + f (OAuth1 consumerToken consumerSecret token secret) = OAuth1.signRequest consumerToken consumerSecret token secret f _ = return diff --git a/Network/Wreq/Internal/OAuth1.hs b/Network/Wreq/Internal/OAuth1.hs index 8ee3dca..e555863 100644 --- a/Network/Wreq/Internal/OAuth1.hs +++ b/Network/Wreq/Internal/OAuth1.hs @@ -1,17 +1,12 @@ -module Network.Wreq.Internal.OAuth1 - ( - signRequest - ) where +module Network.Wreq.Internal.OAuth1 (signRequest) where import Network.HTTP.Client (Request(..)) -import Network.Wreq.Internal.Types (Auth(..)) import Web.Authenticate.OAuth ( signOAuth, newOAuth, oauthConsumerKey , oauthConsumerSecret, newCredential) +import qualified Data.ByteString as S -signRequest :: Auth -> Request -> IO Request -signRequest (OAuth1 consumerToken consumerSecret token tokenSecret) requestToSign = signOAuth app creds requestToSign +signRequest :: S.ByteString -> S.ByteString -> S.ByteString -> S.ByteString -> Request -> IO Request +signRequest consumerToken consumerSecret token tokenSecret = signOAuth app creds where app = newOAuth { oauthConsumerKey = consumerToken, oauthConsumerSecret = consumerSecret } creds = newCredential token tokenSecret - -signRequest _ requestToSign = return requestToSign diff --git a/Network/Wreq/Internal/Types.hs b/Network/Wreq/Internal/Types.hs index 97ce97b..40c5b57 100644 --- a/Network/Wreq/Internal/Types.hs +++ b/Network/Wreq/Internal/Types.hs @@ -178,6 +178,8 @@ data Auth = BasicAuth S.ByteString S.ByteString -- ^ Amazon Web Services request signing -- AWSAuthVersion key secret | OAuth1 S.ByteString S.ByteString S.ByteString S.ByteString + -- ^ OAuth1 request signing + -- OAuth1 consumerToken consumerSecret token secret deriving (Eq, Show, Typeable) data AWSAuthVersion = AWSv4 diff --git a/wreq.cabal b/wreq.cabal index d69eece..6398ad0 100644 --- a/wreq.cabal +++ b/wreq.cabal @@ -80,9 +80,9 @@ library other-modules: Network.Wreq.Internal Network.Wreq.Internal.AWS - Network.Wreq.Internal.OAuth1 Network.Wreq.Internal.Lens Network.Wreq.Internal.Link + Network.Wreq.Internal.OAuth1 Network.Wreq.Internal.Types Network.Wreq.Lens.Machinery Network.Wreq.Lens.TH