fixed typos, added error prefix and added usage to README.md

This commit is contained in:
ston1th 2018-09-13 16:29:45 +02:00
commit 4076e5cf17
3 changed files with 83 additions and 21 deletions

View file

@ -1 +1,61 @@
# jwt - a simple JSON Web Token library in Go # jwt - a simple JSON Web Token library written in Go
## Usage
```
package main
import (
"fmt"
"git.giftfish.de/ston1th/jwt"
"log"
"time"
)
func main() {
// create a new signing instance
JWT, err := jwt.New(time.Hour, jwt.NewMemBlacklist(), nil)
if err != nil {
log.Fatal(err)
}
// create a new token
t := jwt.NewToken(jwt.Claims{
"username": "admin",
}, nil)
// sign the token
err = JWT.Sign(t)
if err != nil {
log.Fatal(err)
}
// print the token string
token := t.String()
fmt.Println(token)
// decode the token string
newToken, err := jwt.DecodeToken(token)
if err != nil {
log.Fatal(err)
}
// verify the decoded token
err = JWT.Verify(newToken)
if err != nil {
log.Fatal(err)
}
// add the token to the blacklist
err = JWT.Invalidate(newToken)
if err != nil {
log.Fatal(err)
}
// try to verify the blacklisted token, it should fail
err = JWT.Verify(newToken)
if err != nil {
log.Fatal(err)
}
}
```

34
jwt.go
View file

@ -39,21 +39,23 @@ const (
// DefaultSecretReader is the default secret key generator // DefaultSecretReader is the default secret key generator
var DefaultSecretReader = rand.Reader var DefaultSecretReader = rand.Reader
const jwtErr = "jwt: "
var ( var (
ErrNoJWT = errors.New("not a json web token") ErrNoJWT = errors.New(jwtErr + "not a json web token")
ErrEmptyToken = errors.New("token is empty") ErrEmptyToken = errors.New(jwtErr + "token is empty")
ErrUnsupportedAlg = errors.New("unsupported algorithm") ErrUnsupportedAlg = errors.New(jwtErr + "unsupported algorithm")
ErrInvalid = errors.New("token validation failed") ErrInvalid = errors.New(jwtErr + "token validation failed")
ErrBlacklisted = errors.New("token blacklisted") ErrBlacklisted = errors.New(jwtErr + "token blacklisted")
ErrBlacklistNotEnabled = errors.New("blacklisting is not enabled") ErrBlacklistNotEnabled = errors.New(jwtErr + "blacklisting is not enabled")
ErrNbf = errors.New("token not valid yet") ErrNbf = errors.New(jwtErr + "token not valid yet")
ErrExp = errors.New("token expired") ErrExp = errors.New(jwtErr + "token expired")
ErrMissingNbf = errors.New("missing nbf claim") ErrMissingNbf = errors.New(jwtErr + "missing nbf claim")
ErrMissingExp = errors.New("missing exp claim") ErrMissingExp = errors.New(jwtErr + "missing exp claim")
ErrMissingTokenParts = errors.New("missing token parts") ErrMissingTokenParts = errors.New(jwtErr + "missing token parts")
ErrEmptySignature = errors.New("token signature is empty") ErrEmptySignature = errors.New(jwtErr + "token signature is empty")
ErrTokenIsNil = errors.New("token is nil") ErrTokenIsNil = errors.New(jwtErr + "token is nil")
ErrInvalidKeySize = errors.New("invalid secret key size") ErrInvalidKeySize = errors.New(jwtErr + "invalid secret key size")
) )
// JWT represents the JSON Web Token signing and blacklisting infrastructure // JWT represents the JSON Web Token signing and blacklisting infrastructure
@ -83,7 +85,7 @@ func New(expiry time.Duration, blacklist Blacklist, secret io.Reader) (*JWT, err
key := make([]byte, KeySize) key := make([]byte, KeySize)
i, err := secret.Read(key) i, err := secret.Read(key)
if err != nil { if err != nil {
return nil, errors.New("secret reader error: " + err.Error()) return nil, errors.New(jwtErr + "secret reader error: " + err.Error())
} }
if i < KeySize { if i < KeySize {
return nil, ErrInvalidKeySize return nil, ErrInvalidKeySize
@ -250,7 +252,7 @@ func (jwt *JWT) Verify(t *Token) error {
return nil return nil
} }
// Stop will end the cleaner goroutinge execution // Stop will end the cleaner goroutine execution
func (jwt *JWT) Stop() error { func (jwt *JWT) Stop() error {
if jwt.blacklist == nil { if jwt.blacklist == nil {
return ErrBlacklistNotEnabled return ErrBlacklistNotEnabled

View file

@ -8,7 +8,7 @@ import (
"strings" "strings"
) )
// Token is the JWT token representation // Token represents a JWT token
type Token struct { type Token struct {
raw string raw string
data string data string
@ -23,17 +23,17 @@ func (t *Token) String() string {
return t.raw return t.raw
} }
// Sig returns the Tokens URLEncoded signature // Sig returns the tokens URLEncoded signature
func (t *Token) Sig() string { func (t *Token) Sig() string {
return t.signature return t.signature
} }
// RawSig returns the Tokens raw signature // RawSig returns the tokens raw signature
func (t *Token) RawSig() []byte { func (t *Token) RawSig() []byte {
return t.rawSignature return t.rawSignature
} }
// Data returns the first two token fields // Data returns the first two URLEncoded token fields
func (t *Token) Data() string { func (t *Token) Data() string {
return t.data return t.data
} }