Created
February 20, 2021 15:42
-
-
Save sgswtky/c0f83c91ccb66901cb52dfc6b202fb9f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"context" | |
"encoding/json" | |
"errors" | |
"fmt" | |
"log" | |
"net/http" | |
"net/url" | |
"os" | |
"github.com/aws/aws-lambda-go/lambda" | |
) | |
var( | |
recaptchaSecret = os.Getenv("RECAPTCHA_SECRET") | |
) | |
func main() { | |
lambda.Start(preSignUpHandler) | |
} | |
type Req map[string]interface{} | |
type RecaptchaResponse struct { | |
Success bool `json:"success"` | |
ChallengeTs string `json:"challenge_ts"` | |
Hostname string `json:"hostname"` | |
Score float64 `json:"score"` | |
Action string `json:"action"` | |
} | |
func preSignUpHandler(ctx context.Context, req Req) (interface{}, error) { | |
fmt.Println("called pre sign up") | |
for k, v := range req { | |
log.Println(fmt.Sprintf("%s => %v", k, v)) | |
} | |
reqReq, isErr := req["request"].(map[string]interface{}) | |
if !isErr { | |
return nil, errors.New("cannot convert response") | |
} | |
clientMetadata, isErr := reqReq["clientMetadata"].(map[string]interface{}) | |
if !isErr { | |
return nil, errors.New("cannot convert clientMetadata") | |
} | |
recaptchaToken, isErr := clientMetadata["recaptchaToken"].(string) | |
if !isErr { | |
return nil, errors.New("cannot convert recaptchaToken") | |
} | |
recaptchaResponse, err := postRecaptchaSiteVerify(recaptchaToken) | |
if err != nil { | |
return nil, errors.New("failed post recaptcha site verify") | |
} | |
log.Println(fmt.Sprintf("%v", recaptchaResponse)) | |
return req, localVerify(recaptchaResponse) | |
} | |
func postRecaptchaSiteVerify(recaptchaToken string)(*RecaptchaResponse, error) { | |
values := url.Values{} | |
values.Add("secret", recaptchaSecret) | |
values.Add("response", recaptchaToken) | |
postResponse, err := http.PostForm( | |
"https://www.google.com/recaptcha/api/siteverify", | |
values, | |
) | |
if err != nil { | |
return nil, errors.New(fmt.Sprintf("error reCAPTCHA post: %v", err)) | |
} | |
defer postResponse.Body.Close() | |
var recaptchaResponse RecaptchaResponse | |
return &recaptchaResponse, json.NewDecoder(postResponse.Body).Decode(&recaptchaResponse) | |
} | |
func localVerify(recaptchaResponse *RecaptchaResponse) error { | |
// TODO: write verify logic. | |
errMsg := "recaptcha failed" | |
if !recaptchaResponse.Success { | |
return errors.New(errMsg) | |
} | |
if recaptchaResponse.Score < 0.5 { | |
return errors.New(errMsg) | |
} | |
return nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment