Support echo server to test POST /verify
TL;DR: - Add common dependencies like Servant, Aeson, Warp, Cors - Define a POST /verify endpoint for our client to hit - POST to /verify client-side onSignIn
This commit is contained in:
		
							parent
							
								
									1fc1087014
								
							
						
					
					
						commit
						a7ddb56b9b
					
				
					 5 changed files with 79 additions and 8 deletions
				
			
		|  | @ -5,8 +5,12 @@ in pkgs.mkShell { | ||||||
|     elmPackages.elm |     elmPackages.elm | ||||||
|     elmPackages.elm-format |     elmPackages.elm-format | ||||||
|     elmPackages.elm-live |     elmPackages.elm-live | ||||||
|     (haskellPackages.ghcWithPackages (hpkgs: with hpkgs; [ |     (haskellPackages.ghcWithPackages (hpkgs: [ | ||||||
|       hspec |       hpkgs.hspec | ||||||
|  |       hpkgs.servant-server | ||||||
|  |       hpkgs.aeson | ||||||
|  |       hpkgs.wai-cors | ||||||
|  |       hpkgs.warp | ||||||
|     ])) |     ])) | ||||||
|   ]; |   ]; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								website/sandbox/learnpianochords/src/server/API.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								website/sandbox/learnpianochords/src/server/API.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | {-# LANGUAGE DataKinds #-} | ||||||
|  | {-# LANGUAGE TypeOperators #-} | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | module API where | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | import Data.Text | ||||||
|  | import Servant.API | ||||||
|  | import Web.Cookie | ||||||
|  | 
 | ||||||
|  | import qualified Types as T | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | type API = "verify" | ||||||
|  |            :> ReqBody '[JSON] T.VerifyGoogleSignInRequest | ||||||
|  |            :> Post '[JSON] NoContent | ||||||
|  | @ -1,6 +1,35 @@ | ||||||
|  | {-# LANGUAGE OverloadedStrings #-} | ||||||
|  | {-# LANGUAGE TypeApplications #-} | ||||||
|  | {-# LANGUAGE RecordWildCards #-} | ||||||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||||||
| module Main where | module Main where | ||||||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||||||
|  | import Servant | ||||||
|  | import API | ||||||
|  | import Control.Monad.IO.Class (liftIO) | ||||||
|  | 
 | ||||||
|  | import qualified Network.Wai.Handler.Warp as Warp | ||||||
|  | import qualified Network.Wai.Middleware.Cors as Cors | ||||||
|  | import qualified Types as T | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | server :: Server API | ||||||
|  | server = verifyGoogleSignIn | ||||||
|  |   where | ||||||
|  |     verifyGoogleSignIn :: T.VerifyGoogleSignInRequest -> Handler NoContent | ||||||
|  |     verifyGoogleSignIn T.VerifyGoogleSignInRequest{..} = do | ||||||
|  |       liftIO $ putStrLn $ "Received: " ++ idToken | ||||||
|  |       pure NoContent | ||||||
| 
 | 
 | ||||||
| main :: IO () | main :: IO () | ||||||
| main = putStrLn "Working!" | main = do | ||||||
|  |   Warp.run 3000 (enforceCors $ serve (Proxy @ API) $ server) | ||||||
|  |   where | ||||||
|  |     enforceCors = Cors.cors (const $ Just corsPolicy) | ||||||
|  |     corsPolicy :: Cors.CorsResourcePolicy | ||||||
|  |     corsPolicy = | ||||||
|  |       Cors.simpleCorsResourcePolicy | ||||||
|  |         { Cors.corsOrigins = Just (["http://localhost:8000"], True) | ||||||
|  |         , Cors.corsMethods = Cors.simpleMethods ++ ["PUT", "PATCH", "DELETE", "OPTIONS"] | ||||||
|  |         , Cors.corsRequestHeaders = Cors.simpleHeaders ++ ["Content-Type", "Authorization"] | ||||||
|  |         } | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								website/sandbox/learnpianochords/src/server/Types.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								website/sandbox/learnpianochords/src/server/Types.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | {-# LANGUAGE RecordWildCards #-} | ||||||
|  | {-# LANGUAGE OverloadedStrings #-} | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | module Types where | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | import Data.Aeson | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | data VerifyGoogleSignInRequest = VerifyGoogleSignInRequest | ||||||
|  |   { idToken :: String | ||||||
|  |   } deriving (Eq, Show) | ||||||
|  | 
 | ||||||
|  | instance FromJSON VerifyGoogleSignInRequest where | ||||||
|  |   parseJSON = withObject "" $ \x -> do | ||||||
|  |     idToken <- x .: "idToken" | ||||||
|  |     pure VerifyGoogleSignInRequest{..} | ||||||
|  | @ -11,11 +11,18 @@ | ||||||
|     <a href="#" onclick="signOut();">Sign out</a> |     <a href="#" onclick="signOut();">Sign out</a> | ||||||
|     <script> |     <script> | ||||||
|      function onSignIn(googleUser) { |      function onSignIn(googleUser) { | ||||||
|        var profile = googleUser.getBasicProfile(); |        var idToken = googleUser.getAuthResponse().id_token; | ||||||
|        console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead. |        fetch('http://localhost:3000/verify', { | ||||||
|        console.log('Name: ' + profile.getName()); |          method: 'POST', | ||||||
|        console.log('Image URL: ' + profile.getImageUrl()); |          headers: { | ||||||
|        console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present. |            'Content-Type': 'application/json', | ||||||
|  |          }, | ||||||
|  |          body: JSON.stringify({ | ||||||
|  |            idToken: idToken, | ||||||
|  |          }) | ||||||
|  |        }) | ||||||
|  |          .then(x => console.log(x)) | ||||||
|  |          .catch(err => console.error(err)); | ||||||
|      } |      } | ||||||
|      function signOut() { |      function signOut() { | ||||||
|        var auth2 = gapi.auth2.getAuthInstance(); |        var auth2 = gapi.auth2.getAuthInstance(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue