Skip to content

Instantly share code, notes, and snippets.

@rahul-yr
Last active July 29, 2022 07:50
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 rahul-yr/d23e24137c851a6f4b7dafa33f4625d4 to your computer and use it in GitHub Desktop.
Save rahul-yr/d23e24137c851a6f4b7dafa33f4625d4 to your computer and use it in GitHub Desktop.
Firebase JWT authentication : Sample functions for token verification
package main
import (
"context"
"fmt"
"log"
"os"
"strings"
"time"
firebase "firebase.google.com/go/v4"
"firebase.google.com/go/v4/auth"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/rahul-yr/learn-go-grapql/graph"
"google.golang.org/api/option"
)
func authCheckerMiddleware(client *auth.Client) gin.HandlerFunc {
return func(c *gin.Context) {
// get token from request header
token := c.Request.Header.Get("Authorization")
if token == "" {
c.AbortWithStatus(401)
return
}
// split bearer token
splitToken := strings.Split(token, "Bearer ")
token = splitToken[1]
// Check if user is authenticated
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
// get user from token
authDetails, err := client.VerifyIDToken(ctx, token)
if err != nil {
log.Printf("error verifying ID token: %v\n", err)
c.AbortWithStatus(401)
return
}
log.Printf("Verified ID token: %v\n", authDetails)
c.Next()
}
}
func setupFirebaseAdmin() (*auth.Client, error) {
opt := option.WithCredentialsFile("C:/Users/rahul/Downloads/sa.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
return nil, fmt.Errorf("error initializing app: %v", err)
}
client, err := app.Auth(context.Background())
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
return nil, err
}
return client, nil
}
// main is the entry point for the application.
func main() {
app, err := setupFirebaseAdmin()
if err != nil {
log.Fatalf("error initializing app: %v", err)
}
// gin setup
gin.SetMode(gin.ReleaseMode)
// create gin engine
router := gin.Default()
// add recovery middleware
// router.Use(gin.Recovery())
// add custom middleware
router.Use(authCheckerMiddleware(app))
// enable cors
router.Use(cors.Default())
// create graphql endpoint
router.POST("/todo", graph.TodoGraphRouter)
// add webserver port
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
// start webserver
router.Run(":" + port)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment