fixed typos, added error prefix and added usage to README.md
This commit is contained in:
parent
b071c473f0
commit
4076e5cf17
3 changed files with 83 additions and 21 deletions
62
README.md
62
README.md
|
|
@ -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
34
jwt.go
|
|
@ -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
|
||||||
|
|
|
||||||
8
token.go
8
token.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue