module Strive.Actions.Authentication
( buildAuthorizeUrl
, exchangeToken
, deauthorize
) where
import Data.ByteString.Char8 (unpack)
import Network.HTTP.Types (Query, renderQuery, toQuery)
import Strive.Aliases
(ApplicationId, ApplicationSecret, AuthorizationCode, RedirectUri, Result)
import Strive.Client (Client, buildClient)
import Strive.Internal.HTTP (post)
import Strive.Options (BuildAuthorizeUrlOptions)
import Strive.Types (DeauthorizationResponse, TokenExchangeResponse)
buildAuthorizeUrl
:: ApplicationId -> RedirectUri -> BuildAuthorizeUrlOptions -> String
buildAuthorizeUrl :: ApplicationId
-> RedirectUri -> BuildAuthorizeUrlOptions -> RedirectUri
buildAuthorizeUrl ApplicationId
clientId RedirectUri
redirectUri BuildAuthorizeUrlOptions
options =
RedirectUri
"https://www.strava.com/oauth/authorize" RedirectUri -> RedirectUri -> RedirectUri
forall a. Semigroup a => a -> a -> a
<> ByteString -> RedirectUri
unpack (Bool -> Query -> ByteString
renderQuery Bool
True Query
query)
where
query :: Query
query =
[(RedirectUri, RedirectUri)] -> Query
forall a. QueryLike a => a -> Query
toQuery
[ (RedirectUri
"client_id", ApplicationId -> RedirectUri
forall a. Show a => a -> RedirectUri
show ApplicationId
clientId)
, (RedirectUri
"redirect_uri", RedirectUri
redirectUri)
, (RedirectUri
"response_type", RedirectUri
"code")
]
Query -> Query -> Query
forall a. Semigroup a => a -> a -> a
<> BuildAuthorizeUrlOptions -> Query
forall a. QueryLike a => a -> Query
toQuery BuildAuthorizeUrlOptions
options
exchangeToken
:: ApplicationId
-> ApplicationSecret
-> AuthorizationCode
-> IO (Result TokenExchangeResponse)
exchangeToken :: ApplicationId
-> RedirectUri -> RedirectUri -> IO (Result TokenExchangeResponse)
exchangeToken ApplicationId
clientId RedirectUri
clientSecret RedirectUri
code = do
Client
client <- Maybe Text -> IO Client
buildClient Maybe Text
forall a. Maybe a
Nothing
Client
-> RedirectUri
-> [(RedirectUri, RedirectUri)]
-> IO (Result TokenExchangeResponse)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> RedirectUri -> q -> IO (Result j)
post Client
client RedirectUri
resource [(RedirectUri, RedirectUri)]
query
where
resource :: RedirectUri
resource = RedirectUri
"oauth/token"
query :: [(RedirectUri, RedirectUri)]
query =
[ (RedirectUri
"client_id", ApplicationId -> RedirectUri
forall a. Show a => a -> RedirectUri
show ApplicationId
clientId)
, (RedirectUri
"client_secret", RedirectUri
clientSecret)
, (RedirectUri
"code", RedirectUri
code)
]
deauthorize :: Client -> IO (Result DeauthorizationResponse)
deauthorize :: Client -> IO (Result DeauthorizationResponse)
deauthorize Client
client = Client
-> RedirectUri -> Query -> IO (Result DeauthorizationResponse)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> RedirectUri -> q -> IO (Result j)
post Client
client RedirectUri
resource Query
query
where
resource :: RedirectUri
resource = RedirectUri
"oauth/deauthorize"
query :: Query
query = [] :: Query