robbert229 / jwt Goto Github PK
View Code? Open in Web Editor NEWThis is an implementation of JWT in golang!
License: MIT License
This is an implementation of JWT in golang!
License: MIT License
Currently there is no support for the ECDSA family of algorithms.
Hi,
I've discovered that this library panics when run with multiple goroutines.
Considering the following minimal example:
package main
import (
"sync"
"github.com/robbert229/jwt"
)
func main() {
algorithm := jwt.HmacSha256("ThisIsTheSecret")
var wg sync.WaitGroup
noRoutines := 10
wg.Add(noRoutines)
for i := 0; i < noRoutines; i++ {
go decode(&algorithm, &wg)
}
wg.Wait()
}
func decode(algorithm *jwt.Algorithm, wg *sync.WaitGroup) {
defer wg.Done()
claims := jwt.NewClaim()
claims.Set("Role", "Admin")
token, err := algorithm.Encode(claims)
if err != nil {
panic(err)
}
for index := 0; index < 100; index++ {
_, err = algorithm.Decode(token)
if err != nil {
panic(err)
}
}
}
Almost every run of this program leads to a panic like
panic: d.nx != 0
goroutine 7 [running]:
crypto/sha256.(*digest).checkSum(0xc42003fd10, 0x0, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/crypto/sha256/sha256.go:157 +0x29e
crypto/sha256.(*digest).Sum(0xc420084080, 0x0, 0x0, 0x0, 0x60, 0x5d, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/crypto/sha256/sha256.go:131 +0x69
crypto/hmac.(*hmac).Sum(0xc420052060, 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0)
/usr/local/Cellar/go/1.9.2/libexec/src/crypto/hmac/hmac.go:46 +0x56
gitlab.com/jwt-test/vendor/github.com/robbert229/jwt.(*Algorithm).sum(0xc42000a060, 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0)
/myGopath/jwt-test/vendor/github.com/robbert229/jwt/algorithms.go:32 +0x51
gitlab.com/jwt-test/vendor/github.com/robbert229/jwt.(*Algorithm).Sign(0xc42000a060, 0xc4200e4000, 0x5d, 0x1104718, 0x1, 0xc4200d4090, 0x2c)
/myGopath/jwt-test/vendor/github.com/robbert229/jwt/algorithms.go:50 +0xff
gitlab.com/jwt-test/vendor/github.com/robbert229/jwt.(*Algorithm).Encode(0xc42000a060, 0xc420090010, 0x110490b, 0x4, 0xc42009e1b8, 0x0)
/myGopath/jwt-test/vendor/github.com/robbert229/jwt/algorithms.go:76 +0x1e7
main.decode(0xc42000a060, 0xc4200160d0)
/myGopath/jwt-test/main.go:24 +0xca
created by main.main
/myGopath/jwt-test/main.go:15 +0xf3
exit status 2
We should at least document how the expected concurrenct usage scenario for this library is.
Currently there is no validation on the JTI
claim.
As described here, please change your comparation to default buildin function when hmac is used
With gratitude,
Vetcher
Algorithm.Sign returns an already base64 encoded string but validateSignature does it again resulting in validate always failing with an invalid signature error.
Not sure if this is the way you'd fix it, but the following change corrects the issue for me:
diff --git a/algorithms.go b/algorithms.go
index 745118c..64f2772 100644
--- a/algorithms.go
+++ b/algorithms.go
@@ -143,9 +143,7 @@ func (a *Algorithm) validateSignature(encoded string) error {
return errors.Wrap(err, "unable to sign token for validation")
}
- b64SignedAttempt := base64.RawURLEncoding.EncodeToString([]byte(signedAttempt))
-
- if !hmac.Equal([]byte(b64Signature), []byte(b64SignedAttempt)) {
+ if !hmac.Equal([]byte(b64Signature), []byte(signedAttempt)) {
return errors.New("invalid signature")
}
So, there's https://godoc.org/golang.org/x/oauth2/jwt.
What's the big diference from it? It could add to readme a note about.
Currently there is no validation on the AUD
claim
Currently there is no validation for the ISS
claim
Currently there is no support for the RSA family of algorithms.
I ran into the following error decoding a JWT on my system:
unable to decode base64 payload: illegal base64 data at input byte 264
Looks like it's related to the base64 decode function being used:
https://github.com/robbert229/jwt/blob/master/algorithms.go#L94
If I switch the line to:
payload, err := base64.RawURLEncoding.DecodeString(b64Payload)
then it works! I suspect all of the encoding/decoding needs to use this. Here's the RFC, for reference.
currently there is no validation based on the SUB
claim
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.