Skip to content

Instantly share code, notes, and snippets.

@sgswtky
Created February 20, 2021 15:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgswtky/c0f83c91ccb66901cb52dfc6b202fb9f to your computer and use it in GitHub Desktop.
Save sgswtky/c0f83c91ccb66901cb52dfc6b202fb9f to your computer and use it in GitHub Desktop.
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