mirror of
https://github.com/1f349/mjwt.git
synced 2024-12-22 15:34:08 +00:00
Major refactor
This commit is contained in:
parent
d1feee2ec3
commit
9a859eb2d7
@ -1,8 +1,8 @@
|
|||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/MrMelon54/mjwt/claims"
|
"github.com/1f349/mjwt/claims"
|
||||||
"github.com/golang-jwt/jwt/v4"
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -3,13 +3,14 @@ package auth
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/MrMelon54/mjwt/claims"
|
"github.com/1f349/mjwt/claims"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateAccessToken(t *testing.T) {
|
func TestCreateAccessToken(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/MrMelon54/mjwt/claims"
|
"github.com/1f349/mjwt/claims"
|
||||||
"github.com/golang-jwt/jwt/v4"
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -3,13 +3,14 @@ package auth
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/MrMelon54/mjwt/claims"
|
"github.com/1f349/mjwt/claims"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateTokenPair(t *testing.T) {
|
func TestCreateTokenPair(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/golang-jwt/jwt/v4"
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -3,12 +3,13 @@ package auth
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateRefreshToken(t *testing.T) {
|
func TestCreateRefreshToken(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestPermStorage_Set(t *testing.T) {
|
func TestPermStorage_Set(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
ps := NewPermStorage()
|
ps := NewPermStorage()
|
||||||
ps.Set("mjwt:test")
|
ps.Set("mjwt:test")
|
||||||
if _, ok := ps.values["mjwt:test"]; !ok {
|
if _, ok := ps.values["mjwt:test"]; !ok {
|
||||||
@ -15,6 +16,7 @@ func TestPermStorage_Set(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPermStorage_Clear(t *testing.T) {
|
func TestPermStorage_Clear(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
ps := NewPermStorage()
|
ps := NewPermStorage()
|
||||||
ps.values["mjwt:test"] = struct{}{}
|
ps.values["mjwt:test"] = struct{}{}
|
||||||
ps.Clear("mjwt:test")
|
ps.Clear("mjwt:test")
|
||||||
@ -24,6 +26,7 @@ func TestPermStorage_Clear(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPermStorage_Has(t *testing.T) {
|
func TestPermStorage_Has(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
ps := NewPermStorage()
|
ps := NewPermStorage()
|
||||||
assert.False(t, ps.Has("mjwt:test"))
|
assert.False(t, ps.Has("mjwt:test"))
|
||||||
ps.values["mjwt:test"] = struct{}{}
|
ps.values["mjwt:test"] = struct{}{}
|
||||||
@ -31,6 +34,7 @@ func TestPermStorage_Has(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPermStorage_OneOf(t *testing.T) {
|
func TestPermStorage_OneOf(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
o := NewPermStorage()
|
o := NewPermStorage()
|
||||||
o.Set("mjwt:test")
|
o.Set("mjwt:test")
|
||||||
o.Set("mjwt:test2")
|
o.Set("mjwt:test2")
|
||||||
@ -48,6 +52,7 @@ func TestPermStorage_OneOf(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPermStorage_MarshalJSON(t *testing.T) {
|
func TestPermStorage_MarshalJSON(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
ps := NewPermStorage()
|
ps := NewPermStorage()
|
||||||
ps.Set("mjwt:test")
|
ps.Set("mjwt:test")
|
||||||
ps.Set("mjwt:test2")
|
ps.Set("mjwt:test2")
|
||||||
@ -57,6 +62,7 @@ func TestPermStorage_MarshalJSON(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPermStorage_MarshalYAML(t *testing.T) {
|
func TestPermStorage_MarshalYAML(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
ps := NewPermStorage()
|
ps := NewPermStorage()
|
||||||
ps.Set("mjwt:test")
|
ps.Set("mjwt:test")
|
||||||
ps.Set("mjwt:test2")
|
ps.Set("mjwt:test2")
|
||||||
|
@ -7,9 +7,9 @@ import (
|
|||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/MrMelon54/mjwt"
|
"github.com/1f349/mjwt"
|
||||||
"github.com/MrMelon54/mjwt/auth"
|
"github.com/1f349/mjwt/auth"
|
||||||
"github.com/MrMelon54/mjwt/claims"
|
"github.com/1f349/mjwt/claims"
|
||||||
"github.com/golang-jwt/jwt/v4"
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"github.com/google/subcommands"
|
"github.com/google/subcommands"
|
||||||
"os"
|
"os"
|
||||||
|
2
go.mod
2
go.mod
@ -1,4 +1,4 @@
|
|||||||
module github.com/MrMelon54/mjwt
|
module github.com/1f349/mjwt
|
||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ func (t testClaims2) Valid() error {
|
|||||||
func (t testClaims2) Type() string { return "testClaims2" }
|
func (t testClaims2) Type() string { return "testClaims2" }
|
||||||
|
|
||||||
func TestExtractClaims(t *testing.T) {
|
func TestExtractClaims(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
@ -45,6 +46,7 @@ func TestExtractClaims(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestExtractClaimsFail(t *testing.T) {
|
func TestExtractClaimsFail(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
33
signer.go
33
signer.go
@ -3,6 +3,8 @@ package mjwt
|
|||||||
import (
|
import (
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
|
"encoding/pem"
|
||||||
|
"fmt"
|
||||||
"github.com/golang-jwt/jwt/v4"
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
@ -43,14 +45,25 @@ func NewMJwtSignerFromFileOrCreate(issuer, file string, random io.Reader, bits i
|
|||||||
// NewMJwtSignerFromFile creates a new defaultMJwtSigner using the path of a
|
// NewMJwtSignerFromFile creates a new defaultMJwtSigner using the path of a
|
||||||
// rsa.PrivateKey file.
|
// rsa.PrivateKey file.
|
||||||
func NewMJwtSignerFromFile(issuer, file string) (Signer, error) {
|
func NewMJwtSignerFromFile(issuer, file string) (Signer, error) {
|
||||||
|
// read file
|
||||||
raw, err := os.ReadFile(file)
|
raw, err := os.ReadFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
key, err := x509.ParsePKCS1PrivateKey(raw)
|
|
||||||
|
// decode pem block
|
||||||
|
block, _ := pem.Decode(raw)
|
||||||
|
if block == nil || block.Type != "RSA PRIVATE KEY" {
|
||||||
|
return nil, fmt.Errorf("invalid rsa private key pem block")
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse private key from pem block
|
||||||
|
key, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create signer using rsa.PrivateKey
|
||||||
return NewMJwtSigner(issuer, key), nil
|
return NewMJwtSigner(issuer, key), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,12 +106,26 @@ func readOrCreatePrivateKey(file string, random io.Reader, bits int) (*rsa.Priva
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keyBytes := pem.EncodeToMemory(&pem.Block{
|
||||||
|
Type: "RSA PRIVATE KEY",
|
||||||
|
Bytes: x509.MarshalPKCS1PrivateKey(key),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// write the key to the file
|
// write the key to the file
|
||||||
err = os.WriteFile(file, x509.MarshalPKCS1PrivateKey(key), 0600)
|
err = os.WriteFile(file, keyBytes, 0600)
|
||||||
return key, err
|
return key, err
|
||||||
} else {
|
} else {
|
||||||
|
// decode pem block
|
||||||
|
block, _ := pem.Decode(f)
|
||||||
|
if block == nil || block.Type != "RSA PRIVATE KEY" {
|
||||||
|
return nil, fmt.Errorf("invalid rsa private key pem block")
|
||||||
|
}
|
||||||
|
|
||||||
// try to parse the private key
|
// try to parse the private key
|
||||||
return x509.ParsePKCS1PrivateKey(f)
|
return x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,23 +4,27 @@ import (
|
|||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
|
"encoding/pem"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewMJwtSigner(t *testing.T) {
|
func TestNewMJwtSigner(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
NewMJwtSigner("Test", key)
|
NewMJwtSigner("Test", key)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewMJwtSignerFromFile(t *testing.T) {
|
func TestNewMJwtSignerFromFile(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
tempKey, err := os.CreateTemp("", "key-test-*.pem")
|
tempKey, err := os.CreateTemp("", "key-test-*.pem")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
_, err = tempKey.Write(x509.MarshalPKCS1PrivateKey(key))
|
b := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})
|
||||||
|
_, err = tempKey.Write(b)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NoError(t, tempKey.Close())
|
assert.NoError(t, tempKey.Close())
|
||||||
signer, err := NewMJwtSignerFromFile("Test", tempKey.Name())
|
signer, err := NewMJwtSignerFromFile("Test", tempKey.Name())
|
||||||
@ -33,6 +37,7 @@ func TestNewMJwtSignerFromFile(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestNewMJwtSignerFromFileOrCreate(t *testing.T) {
|
func TestNewMJwtSignerFromFileOrCreate(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
tempKey, err := os.CreateTemp("", "key-test-*.pem")
|
tempKey, err := os.CreateTemp("", "key-test-*.pem")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NoError(t, tempKey.Close())
|
assert.NoError(t, tempKey.Close())
|
||||||
@ -41,15 +46,17 @@ func TestNewMJwtSignerFromFileOrCreate(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
signer2, err := NewMJwtSignerFromFileOrCreate("Test", tempKey.Name(), rand.Reader, 2048)
|
signer2, err := NewMJwtSignerFromFileOrCreate("Test", tempKey.Name(), rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, signer.(*defaultMJwtSigner).key.Equal(signer2.(*defaultMJwtSigner).key))
|
assert.True(t, signer.PrivateKey().Equal(signer2.PrivateKey()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReadOrCreatePrivateKey(t *testing.T) {
|
func TestReadOrCreatePrivateKey(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
tempKey, err := os.CreateTemp("", "key-test-*.pem")
|
tempKey, err := os.CreateTemp("", "key-test-*.pem")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
_, err = tempKey.Write(x509.MarshalPKCS1PrivateKey(key))
|
b := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})
|
||||||
|
_, err = tempKey.Write(b)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NoError(t, tempKey.Close())
|
assert.NoError(t, tempKey.Close())
|
||||||
key2, err := readOrCreatePrivateKey(tempKey.Name(), rand.Reader, 2048)
|
key2, err := readOrCreatePrivateKey(tempKey.Name(), rand.Reader, 2048)
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestNewMJwtVerifierFromFile(t *testing.T) {
|
func TestNewMJwtVerifierFromFile(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
key, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user