# Packages
No description provided by the author
# README
Authentication token module for Golang
Built with the tools and technologies:
๐ Table of Contents
- ๐ Overview
- ๐พ Features
- ๐ Project Structure
- ๐ Getting Started
- ๐ Project Roadmap
- ๐ฐ Contributing
- ๐ License
- ๐ Acknowledgments
๐ Overview
A Go module for seamless JWT & PASETO token integration
๐พ Features
- JWT
- PASETO V2
- PASETO V3
๐ Project Structure
โโโ token/
โโโ .github
โ โโโ workflows
โ โโโ test-and-coverage.yml
โโโ LICENSE.txt
โโโ README.MD
โโโ coverage.svg
โโโ go.mod
โโโ go.sum
โโโ jwt_asym_maker.go
โโโ jwt_asym_maker_test.go
โโโ jwt_maker.go
โโโ jwt_maker_test.go
โโโ main
โ โโโ demo
โ โ โโโ util.go
โ โ โโโ v2.go
โ โ โโโ v3.go
โ โโโ test.go
โโโ makefile
โโโ maker.go
โโโ paseto_v2_local_maker.go
โโโ paseto_v2_local_maker_test.go
โโโ paseto_v2_public_maker.go
โโโ paseto_v2_public_maker_test.go
โโโ paseto_v3_local_maker.go
โโโ paseto_v3_local_maker_test.go
โโโ paseto_v3_public_maker.go
โโโ paseto_v3_public_maker_test.go
โโโ payload.go
โโโ payload_test.go
โโโ testCoverage.out
๐ Project Index
token/
__root__
LICENSE.txt โฏ License file
jwt_maker.go โฏ Token maker for Symmetric JWT tokens
maker.go โฏ Token maker interface
paseto_v3_local_maker_test.go โฏ Test file
jwt_asym_maker_test.go โฏ Test file
makefile โฏ make file for tests
paseto_v2_public_maker.go โฏ Token maker for Paseto V2 Public tokens (Asymmetrical)
go.mod โฏ go mod file
jwt_maker_test.go โฏ Test file
go.sum โฏ go sum
paseto_v2_public_maker_test.go โฏ Test file
paseto_v2_local_maker.go โฏ Token maker for Paseto V2 Local tokens (Symmetrical)
paseto_v3_local_maker.go โฏ Token maker for Paseto V3 Local tokens (Symmetrical)
payload.go โฏ Predefined payload with username and token id fields
testCoverage.out โฏ Test coverage results
jwt_asym_maker.go โฏ Token maker for Asymmetric JWT tokens
payload_test.go โฏ Test file
paseto_v2_local_maker_test.go โฏ Test file
paseto_v3_public_maker_test.go โฏ Test file
paseto_v3_public_maker.go โฏ Token maker for Paseto V3 Public tokens (Asymmetrical)
README.MD โฏ Documentation
.github
workflows
test-and-coverage.yml โฏ Work flow to run unit tests (on push) and update readme with test coverage badge
๐ Getting Started
โ๏ธ Prerequisites
Before getting started with token, ensure your runtime environment meets the following requirements:
- Programming Language: Go
- Package Manager: Go modules
โ๏ธ Installation
Install the project dependencies:
โฏ go get github.com/fsobh/token
๐ค Usage
- Paseto V2
package main
import (
"aidanwoods.dev/go-paseto"
"encoding/json"
"fmt"
"github.com/fsobh/token"
"log"
"time"
)
func toJSON(data interface{}) string {
jsonBytes, err := json.MarshalIndent(data, "", " ")
if err != nil {
log.Fatalf("Failed to marshal to JSON: %v", err)
}
return string(jsonBytes)
}
func main() {
// ** Paseto V2 Local **
// Generate Keys
symmetricKeyV2 := paseto.NewV2SymmetricKey()
// convert keys to Hex
symmetricKeyStringV2 := symmetricKeyV2.ExportHex()
localMakerV2, err := token.NewPasetoV2Local(symmetricKeyStringV2)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V2 local token maker: %w", err)
}
localTokenStringV2, localPayloadV2, err := localMakerV2.CreateToken("alice", 24*time.Hour)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V2 local token: %w", err)
}
fmt.Println("Created Paseto V2 local Token (JSON):")
fmt.Println(toJSON(map[string]interface{}{
"token": localTokenStringV2,
"payload": localPayloadV2,
"expiration": localPayloadV2.ExpiredAt,
}))
// Verify the token
verifiedPayload, err := localMakerV2.VerifyToken(localTokenStringV2)
if err != nil {
_ = fmt.Errorf("failed to verify Paseto V2 local token: %w", err)
}
// Display verified payload in JSON
fmt.Println("Verified Paseto V2 local Payload (JSON):")
fmt.Println(toJSON(verifiedPayload))
// ** Paseto V2 Public **
// generate keys
privateKeyV2 := paseto.NewV2AsymmetricSecretKey()
publicKeyV2 := privateKeyV2.Public()
// convert keys to Hex
privateKeyStringV2 := privateKeyV2.ExportHex()
publicKeyStringV2 := publicKeyV2.ExportHex()
publicMakerV2, err := token.NewPasetoV2Public(privateKeyStringV2, publicKeyStringV2)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V2 public token maker: %w", err)
}
publicTokenStringV2, publicPayloadV2, err := publicMakerV2.CreateToken("charlie", 24*time.Hour)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V2 public token: %w", err)
}
fmt.Println("Created Paseto V2 public Token (JSON):")
fmt.Println(toJSON(map[string]interface{}{
"token": publicTokenStringV2,
"payload": publicPayloadV2,
"expiration": publicPayloadV2.ExpiredAt,
}))
publicVerifiedPayloadV2, err := publicMakerV2.VerifyToken(publicTokenStringV2)
if err != nil {
_ = fmt.Errorf("failed to verify Paseto V2 public token: %w", err)
}
fmt.Println("Verified Paseto V2 public Payload (JSON):")
fmt.Println(toJSON(publicVerifiedPayloadV2))
}
- Paseto V3
package main
import (
"aidanwoods.dev/go-paseto"
"encoding/json"
"fmt"
"github.com/fsobh/token"
"log"
"time"
)
func toJSON(data interface{}) string {
jsonBytes, err := json.MarshalIndent(data, "", " ")
if err != nil {
log.Fatalf("Failed to marshal to JSON: %v", err)
}
return string(jsonBytes)
}
func main() {
// ** Paseto V3 Local **
symmetricKeyV3 := paseto.NewV3SymmetricKey()
symmetricKeyStringV3 := symmetricKeyV3.ExportHex()
localMakerV3, err := token.NewPasetoV3Local(symmetricKeyStringV3)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V3 local token maker: %w", err)
}
localTokenStringV3, localPayloadV3, err := localMakerV3.CreateToken("bob", 24*time.Hour)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V3 local token: %w", err)
}
fmt.Println("Created Paseto V3 local Token (JSON):")
fmt.Println(toJSON(map[string]interface{}{
"token": localTokenStringV3,
"payload": localPayloadV3,
"expiration": localPayloadV3.ExpiredAt,
}))
localVerifiedPayloadV3, err := localMakerV3.VerifyToken(localTokenStringV3)
if err != nil {
_ = fmt.Errorf("failed to verify Paseto V3 local token: %w", err)
}
fmt.Println("Verified Paseto V3 local Payload (JSON):")
fmt.Println(toJSON(localVerifiedPayloadV3))
// ** Paseto V3 Public **
privateKeyV3 := paseto.NewV3AsymmetricSecretKey()
publicKeyV3 := privateKeyV3.Public()
privateKeyStringV3 := privateKeyV3.ExportHex()
publicKeyStringV3 := publicKeyV3.ExportHex()
publicMakerV3, err := token.NewPasetoV3Public(privateKeyStringV3, publicKeyStringV3)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V3 public token maker: %w", err)
}
// Create a token
publicTokenStringV3, publicPayloadV3, err := publicMakerV3.CreateToken("dave", 24*time.Hour)
if err != nil {
_ = fmt.Errorf("failed to create Paseto V3 public token: %w", err)
}
// Display token and payload in JSON
fmt.Println("Created Paseto V3 public Token (JSON):")
fmt.Println(toJSON(map[string]interface{}{
"token": publicTokenStringV3,
"payload": publicPayloadV3,
"expiration": publicPayloadV3.ExpiredAt,
}))
// Verify the token
publicVerifiedPayloadV3, err := publicMakerV3.VerifyToken(publicTokenStringV3)
if err != nil {
_ = fmt.Errorf("failed to verify Paseto V3 public token: %w", err)
}
// Display verified payload in JSON
fmt.Println("Verified Paseto V3 public Payload (JSON):")
fmt.Println(toJSON(publicVerifiedPayloadV3))
}
๐งช Testing
Run the test suite using the following command:
Using go modules
ย
โฏ make test
๐ Project Roadmap
-
Task 1
:Implement JWT options. -
Task 2
:Implement Paseto V2-V3 public and local options -
Task 3
: Implement feature Paseto V4 public and local options.
๐ฐ Contributing
- ๐ฌ Join the Discussions: Share your insights, provide feedback, or ask questions.
- ๐ Report Issues: Submit bugs found or log feature requests for the
token
project. - ๐ก Submit Pull Requests: Review open PRs, and submit your own PRs.
Contributing Guidelines
- Fork the Repository: Start by forking the project repository to your github account.
- Clone Locally: Clone the forked repository to your local machine using a git client.
git clone https://github.com/fsobh/token
- Create a New Branch: Always work on a new branch, giving it a descriptive name.
git checkout -b new-feature-x
- Make Your Changes: Develop and test your changes locally.
- Commit Your Changes: Commit with a clear message describing your updates.
git commit -m 'Implemented new feature x.'
- Push to github: Push the changes to your forked repository.
git push origin new-feature-x
- Submit a Pull Request: Create a PR against the original project repository. Clearly describe the changes and their motivations.
- Review: Once your PR is reviewed and approved, it will be merged into the main branch. Congratulations on your contribution!
๐ License
This project is protected under the MIT License. For more details, refer to the LICENSE file.
๐ Acknowledgments
- aidantwoods for implementing go-paseto for the core functionality