Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: server/auth/delegation/checker.go

Issue 2386643003: auth: Make luci-go services trust signatures produced by the token server. (Closed)
Patch Set: add tests Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « server/auth/authtest/db.go ('k') | server/auth/delegation/checker_test.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: server/auth/delegation/checker.go
diff --git a/server/auth/delegation/checker.go b/server/auth/delegation/checker.go
index e9123a94d7d7b035875960d1327a87fb862f439a..94319927c45138dcce88a801681ac018ac530dc5 100644
--- a/server/auth/delegation/checker.go
+++ b/server/auth/delegation/checker.go
@@ -50,14 +50,19 @@ var (
ErrForbiddenDelegationToken = errors.New("auth: forbidden delegation token")
)
-// CertificatesProvider is accepted by 'CheckToken'.
+// CertificatesProvider is used by 'CheckToken', it is implemented by authdb.DB.
+//
+// It returns certificates of services trusted to sign tokens.
type CertificatesProvider interface {
- // GetAuthServiceCertificates returns a bundle with certificates of a primary
- // auth service.
- GetAuthServiceCertificates(c context.Context) (*signing.PublicCertificates, error)
+ // GetCertificates returns a bundle with certificates of a trusted signer.
+ //
+ // Returns (nil, nil) if the given signer is not trusted.
+ //
+ // Returns errors (usually transient) if the bundle can't be fetched.
+ GetCertificates(c context.Context, id identity.Identity) (*signing.PublicCertificates, error)
}
-// GroupsChecker is accepted by 'CheckToken'.
+// GroupsChecker is accepted by 'CheckToken', it is implemented by authdb.DB.
type GroupsChecker interface {
// IsMember returns true if the given identity belongs to the given group.
//
@@ -70,7 +75,7 @@ type GroupsChecker interface {
type CheckTokenParams struct {
Token string // the delegation token to check
PeerID identity.Identity // identity of the caller, as extracted from its credentials
- CertificatesProvider CertificatesProvider // returns auth service certificates
+ CertificatesProvider CertificatesProvider // returns certificates with trusted keys
GroupsChecker GroupsChecker // knows how to do group lookups
OwnServiceIdentity identity.Identity // identity of the current service
}
@@ -126,16 +131,17 @@ func deserializeToken(token string) (*messages.DelegationToken, error) {
//
// May return transient errors.
func unsealToken(c context.Context, tok *messages.DelegationToken, certsProvider CertificatesProvider) (*messages.Subtoken, error) {
- // Grab the public keys of the primary auth service. It is the service that
- // signs tokens.
- //
- // TODO(vadimsh): There's 'signer_id' field in the DelegationToken proto. We
- // ignore it for now. If we ever support multiple trusted signers, we'd need
- // to start using it to pick the correct public key. For now only the central
- // auth service is trusted, so we just grab its certs.
- certs, err := certsProvider.GetAuthServiceCertificates(c)
+ // Grab the public keys of the service that signed the token, if we trust it.
+ signerID, err := identity.MakeIdentity(tok.SignerId)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("bad signer_id %q - %s", tok.SignerId, err)
+ }
+ certs, err := certsProvider.GetCertificates(c, signerID)
+ switch {
+ case err != nil:
+ return nil, fmt.Errorf("failed to grab certificates of %q - %s", tok.SignerId, err)
+ case certs == nil:
+ return nil, fmt.Errorf("the signer %q is not trusted", tok.SignerId)
}
// Check the signature on the token.
« no previous file with comments | « server/auth/authtest/db.go ('k') | server/auth/delegation/checker_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698