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
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)]