Last active
July 29, 2022 07:50
-
-
Save rahul-yr/d23e24137c851a6f4b7dafa33f4625d4 to your computer and use it in GitHub Desktop.
Firebase JWT authentication : Sample functions for token verification
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" | |
"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