@@ -4,12 +4,25 @@ import { Authenticator } from './auth';
4
4
import { User } from './config_types' ;
5
5
6
6
export class ExecAuth implements Authenticator {
7
+ private tokenCache : any = { } ;
8
+
7
9
public isAuthProvider ( user : User ) {
8
10
return user . authProvider . name === 'exec' ||
9
11
( user . authProvider . config && user . authProvider . config . exec ) ;
10
12
}
11
13
12
14
public getToken ( user : User ) : string | null {
15
+ // TODO: Handle client cert auth here, requires auth refactor.
16
+ // See https://kubernetes.io/docs/reference/access-authn-authz/authentication/#input-and-output-formats
17
+ // for details on this protocol.
18
+ const cachedToken = this . tokenCache [ user . name ] ;
19
+ if ( cachedToken ) {
20
+ const date = Date . parse ( cachedToken . status . expirationTimestamp ) ;
21
+ if ( date < Date . now ( ) ) {
22
+ return cachedToken . status . token ;
23
+ }
24
+ this . tokenCache [ user . name ] = null ;
25
+ }
13
26
const config = user . authProvider . config ;
14
27
if ( ! config . exec . command ) {
15
28
throw new Error ( 'No command was specified for exec authProvider!' ) ;
@@ -27,7 +40,7 @@ export class ExecAuth implements Authenticator {
27
40
const result = shell . exec ( cmd , opts ) ;
28
41
if ( result . code === 0 ) {
29
42
const obj = JSON . parse ( result . stdout ) ;
30
- return `Bearer ${ obj . token } ` ;
43
+ return `Bearer ${ obj . status . token } ` ;
31
44
}
32
45
throw new Error ( result . stderr ) ;
33
46
}
0 commit comments