module Instagram.Auth (
RedirectUri,
getUserAccessTokenURL1,
getUserAccessTokenURL2
) where
import Instagram.Monad
import Instagram.Types
import Data.Text hiding (map)
import Control.Monad (liftM)
import qualified Data.ByteString as BS (ByteString,intercalate)
import qualified Data.Text.Encoding as TE
import qualified Network.HTTP.Types as HT
import Data.Conduit
type RedirectUri = Text
getUserAccessTokenURL1 :: Monad m =>
RedirectUri
-> [Scope]
-> InstagramT m Text
getUserAccessTokenURL1 url scopes= do
cid<-liftM clientIDBS getCreds
bsurl<-getQueryURL "/oauth/authorize/" $ buildQuery cid ++ buildScopes scopes
return $ TE.decodeUtf8 bsurl
where
buildQuery :: BS.ByteString -> HT.SimpleQuery
buildQuery cid=[("client_id",cid),("redirect_uri",TE.encodeUtf8 url),("response_type","code")]
buildScopes :: [Scope] -> HT.SimpleQuery
buildScopes []=[]
buildScopes l =[("scope",BS.intercalate "+" $ map (TE.encodeUtf8 . toLower . pack . show) l)]
getUserAccessTokenURL2 :: (MonadBaseControl IO m, MonadResource m) =>
RedirectUri
-> Text
-> InstagramT m OAuthToken
getUserAccessTokenURL2 url code=
addClientInfos buildQuery >>= getPostRequest "/oauth/access_token" >>= getJSONResponse
where
buildQuery :: HT.SimpleQuery
buildQuery =[("redirect_uri",TE.encodeUtf8 url),("grant_type","authorization_code"),
("code",TE.encodeUtf8 code)]