mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-08-24 21:17:31 +00:00
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package oidc
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
jose "github.com/go-jose/go-jose/v4"
|
|
fositejwt "github.com/ory/fosite/token/jwt"
|
|
)
|
|
|
|
// SigningKeyFromSigner wraps the raw signing key in a *jose.JSONWebKey that carries the
|
|
// key's algorithm.
|
|
//
|
|
// fosite's DefaultSigner picks the JOSE algorithm from the Go key TYPE alone: every
|
|
// *rsa.PrivateKey is signed with RS256 and every *ecdsa.PrivateKey with ES256, while an
|
|
// ed25519.PrivateKey is not supported at all.
|
|
func SigningKeyFromSigner(signer TokenSigner) (*jose.JSONWebKey, error) {
|
|
rawKey := signer.GetPrivateKey()
|
|
if rawKey == nil {
|
|
return nil, errors.New("signing key is not available")
|
|
}
|
|
|
|
alg, err := signer.GetKeyAlg()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
signingKey := &jose.JSONWebKey{
|
|
Key: rawKey,
|
|
Algorithm: alg.String(),
|
|
}
|
|
|
|
if keyID, ok := signer.GetKeyID(); ok {
|
|
signingKey.KeyID = keyID
|
|
}
|
|
|
|
return signingKey, nil
|
|
}
|
|
|
|
type jwtSigner struct {
|
|
*fositejwt.DefaultSigner
|
|
}
|
|
|
|
func newJWTSigner(keyGetter fositejwt.GetPrivateKeyFunc) *jwtSigner {
|
|
return &jwtSigner{
|
|
DefaultSigner: &fositejwt.DefaultSigner{GetPrivateKey: keyGetter},
|
|
}
|
|
}
|
|
|
|
func (s *jwtSigner) Validate(ctx context.Context, token string) (string, error) {
|
|
if _, err := s.Decode(ctx, token); err != nil {
|
|
return "", err
|
|
}
|
|
return s.GetSignature(ctx, token)
|
|
}
|
|
|
|
func (s *jwtSigner) Decode(ctx context.Context, token string) (*fositejwt.Token, error) {
|
|
key, err := s.GetPrivateKey(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
verificationKey := key
|
|
if jsonWebKey, ok := key.(*jose.JSONWebKey); ok {
|
|
verificationKey = new(jsonWebKey.Public())
|
|
}
|
|
|
|
return fositejwt.Parse(token, func(*fositejwt.Token) (any, error) {
|
|
return verificationKey, nil
|
|
})
|
|
}
|