src/auth/jwtclient.ts
constructor(optionsOrEmail?: string | JWTOptions, keyFile?: string, key?: string, scopes?: string | string[], subject?: string, keyId?: string)
|
|||||||||||||||||||||
Defined in src/auth/jwtclient.ts:73
|
|||||||||||||||||||||
Parameters :
|
Optional additionalClaims |
Type : literal type
|
Defined in src/auth/jwtclient.ts:49
|
Optional email |
Type : string
|
Defined in src/auth/jwtclient.ts:41
|
Optional gtoken |
Type : GoogleToken
|
Defined in src/auth/jwtclient.ts:48
|
Optional key |
Type : string
|
Defined in src/auth/jwtclient.ts:43
|
Optional keyFile |
Type : string
|
Defined in src/auth/jwtclient.ts:42
|
Optional keyId |
Type : string
|
Defined in src/auth/jwtclient.ts:44
|
Optional scope |
Type : string
|
Defined in src/auth/jwtclient.ts:46
|
Optional scopes |
Type : string | string[]
|
Defined in src/auth/jwtclient.ts:45
|
Optional subject |
Type : string
|
Defined in src/auth/jwtclient.ts:47
|
Optional _clientId |
Type : string
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:367
|
Optional _clientSecret |
Type : string
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:370
|
Optional apiKey |
Type : string
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:372
|
eagerRefreshThresholdMillis |
Type : number
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:376
|
Optional projectId |
Type : string
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:374
|
authorize |
authorize()
|
Defined in src/auth/jwtclient.ts:179
|
Get the initial access token using gToken.
Returns :
Promise<Credentials>
Promise that resolves with credentials |
authorize | ||||||
authorize(callback: (err: Error | null,result: Credentials) => void)
|
||||||
Defined in src/auth/jwtclient.ts:180
|
||||||
Parameters :
Returns :
void
|
authorize | ||||||
authorize(callback?: (err?: Error | null,result?: Credentials) => void)
|
||||||
Defined in src/auth/jwtclient.ts:181
|
||||||
Parameters :
Returns :
Promise | void
|
createScoped | ||||||||
createScoped(scopes?: string | string[])
|
||||||||
Defined in src/auth/jwtclient.ts:102
|
||||||||
Creates a copy of the credential with the specified scopes.
Parameters :
Returns :
JWT
The cloned instance. |
createScopedRequired |
createScopedRequired()
|
Defined in src/auth/jwtclient.ts:154
|
Indicates whether the credential requires scopes to be created by calling createScoped before use.
Returns :
boolean
false if createScoped does not need to be called. |
fromAPIKey | ||||||||
fromAPIKey(apiKey: string)
|
||||||||
Defined in src/auth/jwtclient.ts:317
|
||||||||
Creates a JWT credentials instance using an API Key for authentication.
Parameters :
Returns :
void
|
fromJSON | ||||||||
fromJSON(json: JWTInput)
|
||||||||
Defined in src/auth/jwtclient.ts:245
|
||||||||
Create a JWT credentials instance using the given input options.
Parameters :
Returns :
void
|
fromStream | |||||||||
fromStream(inputStream: stream.Readable, callback: (err: Error | null) => void)
|
|||||||||
Defined in src/auth/jwtclient.ts:274
|
|||||||||
Parameters :
Returns :
void
|
fromStream | |||||||||
fromStream(inputStream: stream.Readable, callback?: (err?: Error | null) => void)
|
|||||||||
Defined in src/auth/jwtclient.ts:278
|
|||||||||
Parameters :
Returns :
void | Promise
|
fromStream | ||||||||
fromStream(inputStream: stream.Readable)
|
||||||||
Defined in src/auth/jwtclient.ts:273
|
||||||||
Create a JWT credentials instance using the given input stream.
Parameters :
Returns :
Promise<void>
|
Async getCredentials |
getCredentials()
|
Defined in src/auth/jwtclient.ts:328
|
Using the key or keyFile on the JWT client, obtain an object that contains the key and the client email.
Returns :
Promise<CredentialBody>
|
generateAuthUrl | ||||||||||
generateAuthUrl(opts: GenerateAuthUrlOpts)
|
||||||||||
Inherited from
OAuth2Client
|
||||||||||
Defined in
OAuth2Client:463
|
||||||||||
Generates URL for consent page landing.
Parameters :
Returns :
string
URL to consent page. |
generateCodeVerifier |
generateCodeVerifier()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:480
|
Returns :
void
|
Async generateCodeVerifierAsync |
generateCodeVerifierAsync()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:493
|
Convenience method to automatically generate a code_verifier, and it's resulting SHA256. If used, this must be paired with a S256 code_challenge_method.
Returns :
{}
|
getAccessToken | ||||||
getAccessToken(callback?: GetAccessTokenCallback)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:669
|
||||||
Parameters :
Returns :
Promise | void
|
getAccessToken | ||||||
getAccessToken(callback: GetAccessTokenCallback)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:668
|
||||||
Parameters :
Returns :
void
|
getAccessToken |
getAccessToken()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:667
|
Get a non-expired access token, after refreshing if necessary
Returns :
Promise<GetAccessTokenResponse>
|
getFederatedSignonCerts | ||||||
getFederatedSignonCerts(callback?: GetFederatedSignonCertsCallback)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:1002
|
||||||
Parameters :
Returns :
Promise | void
|
getFederatedSignonCerts |
getFederatedSignonCerts()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:1000
|
Gets federated sign-on certificates to use for verifying identity tokens. Returns certs as array structure, where keys are key ids, and values are certificates in either PEM or JWK format.
Returns :
Promise<FederatedSignonCertsResponse>
|
getFederatedSignonCerts | ||||||
getFederatedSignonCerts(callback: GetFederatedSignonCertsCallback)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:1001
|
||||||
Parameters :
Returns :
void
|
Async getFederatedSignonCertsAsync |
getFederatedSignonCertsAsync()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:1015
|
Returns :
Promise<FederatedSignonCertsResponse>
|
Async getRequestHeaders | ||||||||
getRequestHeaders(url?: string)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:736
|
||||||||
The main authentication interface. It takes an optional url which when present is the endpoint being accessed, and returns a Promise which resolves with authorization header fields. In OAuth2Client, the result has the form:
{ Authorization: 'Bearer
Parameters :
Returns :
Promise<Headers>
|
getRequestMetadata | ||||||||
getRequestMetadata(url?: string | null)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:707
|
||||||||
Obtain the set of headers required to authenticate a request.
Parameters :
Returns :
Promise<RequestMetadataResponse>
|
getRequestMetadata | |||||||||
getRequestMetadata(url: string | null, callback: RequestMetadataCallback)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:708
|
|||||||||
Parameters :
Returns :
void
|
getRequestMetadata | |||||||||
getRequestMetadata(url: string | null, callback?: RequestMetadataCallback)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:712
|
|||||||||
Parameters :
Returns :
Promise | void
|
Static getRevokeTokenUrl | ||||||||
getRevokeTokenUrl(token: string)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:790
|
||||||||
Generates an URL to revoke the given token.
Parameters :
Returns :
string
|
getToken | |||||||||
getToken(options: GetTokenOptions, callback: GetTokenCallback)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:525
|
|||||||||
Parameters :
Returns :
void
|
getToken | |||||||||
getToken(codeOrOptions: string | GetTokenOptions, callback?: GetTokenCallback)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:526
|
|||||||||
Parameters :
Returns :
Promise | void
|
getToken | |||||||||
getToken(code: string, callback: GetTokenCallback)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:524
|
|||||||||
Parameters :
Returns :
void
|
getToken | ||||||||
getToken(code: string)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:522
|
||||||||
Gets the access token for the given code.
Parameters :
Returns :
Promise<GetTokenResponse>
|
getToken | ||||||
getToken(options: GetTokenOptions)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:523
|
||||||
Parameters :
Returns :
Promise<GetTokenResponse>
|
Async getTokenInfo | ||||||||
getTokenInfo(accessToken: string)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:976
|
||||||||
Obtains information about the provisioned access token. Especially useful if you want to check the scopes that were provisioned to a given token.
Parameters :
Returns :
Promise<TokenInfo>
|
refreshAccessToken | ||||||
refreshAccessToken(callback?: RefreshAccessTokenCallback)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:640
|
||||||
Parameters :
Returns :
Promise | void
|
refreshAccessToken | ||||||
refreshAccessToken(callback: RefreshAccessTokenCallback)
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:639
|
||||||
Parameters :
Returns :
void
|
refreshAccessToken |
refreshAccessToken()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:638
|
Retrieves the access token using refresh token
Returns :
Promise<RefreshAccessTokenResponse>
|
request | |||||||||
request(opts: GaxiosOptions, callback?: BodyResponseCallback
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:860
|
|||||||||
Type parameters :
|
|||||||||
Parameters :
Returns :
GaxiosPromise | void
|
request | |||||||||
request(opts: GaxiosOptions, callback: BodyResponseCallback
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:859
|
|||||||||
Type parameters :
|
|||||||||
Parameters :
Returns :
void
|
request | ||||||||
request(opts: GaxiosOptions)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:858
|
||||||||
Type parameters :
|
||||||||
Provides a request implementation with OAuth 2.0 flow. If credentials have a refresh_token, in cases of HTTP 401 and 403 responses, it automatically asks for a new access token and replays the unsuccessful request.
Parameters :
Returns :
GaxiosPromise<T>
Request object |
revokeCredentials | ||||||
revokeCredentials(callback?: BodyResponseCallback
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:830
|
||||||
Parameters :
Returns :
GaxiosPromise | void
|
revokeCredentials | ||||||
revokeCredentials(callback: BodyResponseCallback
|
||||||
Inherited from
OAuth2Client
|
||||||
Defined in
OAuth2Client:827
|
||||||
Parameters :
Returns :
void
|
revokeCredentials |
revokeCredentials()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:826
|
Revokes access token and clears the credentials object
Returns :
GaxiosPromise<RevokeCredentialsResult>
|
revokeToken | |||||||||
revokeToken(token: string, callback?: BodyResponseCallback
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:805
|
|||||||||
Parameters :
Returns :
GaxiosPromise | void
|
revokeToken | ||||||||
revokeToken(token: string)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:800
|
||||||||
Revokes the access given to token.
Parameters :
Returns :
GaxiosPromise<RevokeCredentialsResult>
|
revokeToken | |||||||||
revokeToken(token: string, callback: BodyResponseCallback
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:801
|
|||||||||
Parameters :
Returns :
void
|
verifyIdToken | |||||||||
verifyIdToken(options: VerifyIdTokenOptions, callback?: (err?: Error | null,login?: LoginTicket) => void)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:931
|
|||||||||
Parameters :
Returns :
void | Promise
|
verifyIdToken | |||||||||
verifyIdToken(options: VerifyIdTokenOptions, callback: (err: Error | null,login: LoginTicket) => void)
|
|||||||||
Inherited from
OAuth2Client
|
|||||||||
Defined in
OAuth2Client:927
|
|||||||||
Parameters :
Returns :
void
|
verifyIdToken | ||||||||
verifyIdToken(options: VerifyIdTokenOptions)
|
||||||||
Inherited from
OAuth2Client
|
||||||||
Defined in
OAuth2Client:926
|
||||||||
Verify id token is token by checking the certs and audience
Parameters :
Returns :
Promise<LoginTicket>
|
verifySignedJwtWithCerts |
verifySignedJwtWithCerts()
|
Inherited from
OAuth2Client
|
Defined in
OAuth2Client:1079
|
Returns :
void
|
Async verifySignedJwtWithCertsAsync | ||||||||||||||||||||||||
verifySignedJwtWithCertsAsync(jwt: string, certs: Certificates, requiredAudience: string | string[], issuers?: string[], maxExpiry?: number)
|
||||||||||||||||||||||||
Inherited from
OAuth2Client
|
||||||||||||||||||||||||
Defined in
OAuth2Client:1097
|
||||||||||||||||||||||||
Verify the id token is signed with the correct certificate and is from the correct audience.
Parameters :
Returns :
{}
Returns a promise resolving to LoginTicket on verification. |
import {GoogleToken} from 'gtoken';
import * as stream from 'stream';
import * as messages from '../messages';
import {CredentialBody, Credentials, JWTInput} from './credentials';
import {JWTAccess} from './jwtaccess';
import {
GetTokenResponse,
OAuth2Client,
RefreshOptions,
RequestMetadataResponse,
} from './oauth2client';
export interface JWTOptions extends RefreshOptions {
email?: string;
keyFile?: string;
key?: string;
keyId?: string;
scopes?: string | string[];
subject?: string;
additionalClaims?: {};
}
export class JWT extends OAuth2Client {
email?: string;
keyFile?: string;
key?: string;
keyId?: string;
scopes?: string | string[];
scope?: string;
subject?: string;
gtoken?: GoogleToken;
additionalClaims?: {};
private access?: JWTAccess;
/**
* JWT service account credentials.
*
* Retrieve access token using gtoken.
*
* @param email service account email address.
* @param keyFile path to private key file.
* @param key value of key
* @param scopes list of requested scopes or a single scope.
* @param subject impersonated account's email address.
* @param key_id the ID of the key
*/
constructor(options: JWTOptions);
constructor(
email?: string,
keyFile?: string,
key?: string,
scopes?: string | string[],
subject?: string,
keyId?: string
);
constructor(
optionsOrEmail?: string | JWTOptions,
keyFile?: string,
key?: string,
scopes?: string | string[],
subject?: string,
keyId?: string
) {
const opts =
optionsOrEmail && typeof optionsOrEmail === 'object'
? optionsOrEmail
: {email: optionsOrEmail, keyFile, key, keyId, scopes, subject};
super({eagerRefreshThresholdMillis: opts.eagerRefreshThresholdMillis});
this.email = opts.email;
this.keyFile = opts.keyFile;
this.key = opts.key;
this.keyId = opts.keyId;
this.scopes = opts.scopes;
this.subject = opts.subject;
this.additionalClaims = opts.additionalClaims;
this.credentials = {refresh_token: 'jwt-placeholder', expiry_date: 1};
}
/**
* Creates a copy of the credential with the specified scopes.
* @param scopes List of requested scopes or a single scope.
* @return The cloned instance.
*/
createScoped(scopes?: string | string[]) {
return new JWT({
email: this.email,
keyFile: this.keyFile,
key: this.key,
keyId: this.keyId,
scopes,
subject: this.subject,
additionalClaims: this.additionalClaims,
});
}
/**
* Obtains the metadata to be sent with the request.
*
* @param url the URI being authorized.
*/
protected async getRequestMetadataAsync(
url?: string | null
): Promise<RequestMetadataResponse> {
if (!this.apiKey && !this.hasScopes() && url) {
if (
this.additionalClaims &&
(this.additionalClaims as {
target_audience: string;
}).target_audience
) {
const {tokens} = await this.refreshToken();
return {headers: {Authorization: `Bearer ${tokens.id_token}`}};
} else {
// no scopes have been set, but a uri has been provided. Use JWTAccess
// credentials.
if (!this.access) {
this.access = new JWTAccess(this.email, this.key, this.keyId);
}
const headers = await this.access.getRequestHeaders(
url,
this.additionalClaims
);
return {headers};
}
} else {
return super.getRequestMetadataAsync(url);
}
}
/**
* Indicates whether the credential requires scopes to be created by calling
* createScoped before use.
* @deprecated
* @return false if createScoped does not need to be called.
*/
createScopedRequired() {
messages.warn(messages.JWT_CREATE_SCOPED_DEPRECATED);
return !this.hasScopes();
}
/**
* Determine if there are currently scopes available.
*/
private hasScopes() {
if (!this.scopes) {
return false;
}
// For arrays, check the array length.
if (this.scopes instanceof Array) {
return this.scopes.length > 0;
}
// For others, convert to a string and check the length.
return String(this.scopes).length > 0;
}
/**
* Get the initial access token using gToken.
* @param callback Optional callback.
* @returns Promise that resolves with credentials
*/
authorize(): Promise<Credentials>;
authorize(callback: (err: Error | null, result?: Credentials) => void): void;
authorize(
callback?: (err: Error | null, result?: Credentials) => void
): Promise<Credentials> | void {
if (callback) {
this.authorizeAsync().then(r => callback(null, r), callback);
} else {
return this.authorizeAsync();
}
}
private async authorizeAsync(): Promise<Credentials> {
const result = await this.refreshToken();
if (!result) {
throw new Error('No result returned');
}
this.credentials = result.tokens;
this.credentials.refresh_token = 'jwt-placeholder';
this.key = this.gtoken!.key;
this.email = this.gtoken!.iss;
return result.tokens;
}
/**
* Refreshes the access token.
* @param refreshToken ignored
* @private
*/
protected async refreshTokenNoCache(
refreshToken?: string | null
): Promise<GetTokenResponse> {
const gtoken = this.createGToken();
const token = await gtoken.getToken();
const tokens = {
access_token: token,
token_type: 'Bearer',
expiry_date: gtoken.expiresAt,
// tslint:disable-next-line no-any
id_token: (gtoken.rawToken! as any).id_token,
};
this.emit('tokens', tokens);
return {res: null, tokens};
}
/**
* Create a gToken if it doesn't already exist.
*/
private createGToken(): GoogleToken {
if (!this.gtoken) {
this.gtoken = new GoogleToken({
iss: this.email,
sub: this.subject,
scope: this.scopes,
keyFile: this.keyFile,
key: this.key,
additionalClaims: this.additionalClaims,
});
}
return this.gtoken;
}
/**
* Create a JWT credentials instance using the given input options.
* @param json The input object.
*/
fromJSON(json: JWTInput): void {
if (!json) {
throw new Error(
'Must pass in a JSON object containing the service account auth settings.'
);
}
if (!json.client_email) {
throw new Error(
'The incoming JSON object does not contain a client_email field'
);
}
if (!json.private_key) {
throw new Error(
'The incoming JSON object does not contain a private_key field'
);
}
// Extract the relevant information from the json key file.
this.email = json.client_email;
this.key = json.private_key;
this.keyId = json.private_key_id;
this.projectId = json.project_id;
}
/**
* Create a JWT credentials instance using the given input stream.
* @param inputStream The input stream.
* @param callback Optional callback.
*/
fromStream(inputStream: stream.Readable): Promise<void>;
fromStream(
inputStream: stream.Readable,
callback: (err?: Error | null) => void
): void;
fromStream(
inputStream: stream.Readable,
callback?: (err?: Error | null) => void
): void | Promise<void> {
if (callback) {
this.fromStreamAsync(inputStream).then(r => callback(), callback);
} else {
return this.fromStreamAsync(inputStream);
}
}
private fromStreamAsync(inputStream: stream.Readable) {
return new Promise<void>((resolve, reject) => {
if (!inputStream) {
throw new Error(
'Must pass in a stream containing the service account auth settings.'
);
}
let s = '';
inputStream
.setEncoding('utf8')
.on('error', reject)
.on('data', chunk => (s += chunk))
.on('end', () => {
try {
const data = JSON.parse(s);
this.fromJSON(data);
resolve();
} catch (e) {
reject(e);
}
});
});
}
/**
* Creates a JWT credentials instance using an API Key for authentication.
* @param apiKey The API Key in string form.
*/
fromAPIKey(apiKey: string): void {
if (typeof apiKey !== 'string') {
throw new Error('Must provide an API Key string.');
}
this.apiKey = apiKey;
}
/**
* Using the key or keyFile on the JWT client, obtain an object that contains
* the key and the client email.
*/
async getCredentials(): Promise<CredentialBody> {
if (this.key) {
return {private_key: this.key, client_email: this.email};
} else if (this.keyFile) {
const gtoken = this.createGToken();
const creds = await gtoken.getCredentials(this.keyFile);
return {private_key: creds.privateKey, client_email: creds.clientEmail};
}
throw new Error('A key or a keyFile must be provided to getCredentials.');
}
}