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. -- diff --git a/Network/Wreq/Internal.hs b/Network/Wreq/Internal.hs index 344ff07..0887e68 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 (OAuth1 consumerToken consumerSecret token secret) = OAuth1.signRequest consumerToken consumerSecret token secret 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..e555863 --- /dev/null +++ b/Network/Wreq/Internal/OAuth1.hs @@ -0,0 +1,12 @@ +module Network.Wreq.Internal.OAuth1 (signRequest) where + +import Network.HTTP.Client (Request(..)) +import Web.Authenticate.OAuth ( signOAuth, newOAuth, oauthConsumerKey + , oauthConsumerSecret, newCredential) +import qualified Data.ByteString as S + +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 diff --git a/Network/Wreq/Internal/Types.hs b/Network/Wreq/Internal/Types.hs index 8465a9b..40c5b57 100644 --- a/Network/Wreq/Internal/Types.hs +++ b/Network/Wreq/Internal/Types.hs @@ -177,6 +177,9 @@ 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 + -- ^ OAuth1 request signing + -- OAuth1 consumerToken consumerSecret token secret deriving (Eq, Show, Typeable) data AWSAuthVersion = AWSv4 diff --git a/wreq.cabal b/wreq.cabal index f9c5a41..6398ad0 100644 --- a/wreq.cabal +++ b/wreq.cabal @@ -82,6 +82,7 @@ library Network.Wreq.Internal.AWS Network.Wreq.Internal.Lens Network.Wreq.Internal.Link + Network.Wreq.Internal.OAuth1 Network.Wreq.Internal.Types Network.Wreq.Lens.Machinery Network.Wreq.Lens.TH @@ -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,