File

src/auth/jwtclient.ts

Extends

OAuth2Client

Index

Properties
Methods

Constructor

constructor(optionsOrEmail?: string | JWTOptions, keyFile?: string, key?: string, scopes?: string | string[], subject?: string, keyId?: string)
Parameters :
Name Type Optional
optionsOrEmail string | JWTOptions Yes
keyFile string Yes
key string Yes
scopes string | string[] Yes
subject string Yes
keyId string Yes

Properties

Optional additionalClaims
Type : literal type
Optional email
Type : string
Optional gtoken
Type : GoogleToken
Optional key
Type : string
Optional keyFile
Type : string
Optional keyId
Type : string
Optional scope
Type : string
Optional scopes
Type : string | string[]
Optional subject
Type : string
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

Methods

authorize
authorize()

Get the initial access token using gToken.

Promise that resolves with credentials

authorize
authorize(callback: (err: Error | null,result: Credentials) => void)
Parameters :
Name Type Optional
callback function No
Returns : void
authorize
authorize(callback?: (err?: Error | null,result?: Credentials) => void)
Parameters :
Name Type Optional
callback function Yes
Returns : Promise | void
createScoped
createScoped(scopes?: string | string[])

Creates a copy of the credential with the specified scopes.

Parameters :
Name Type Optional Description
scopes string | string[] Yes

List of requested scopes or a single scope.

Returns : JWT

The cloned instance.

createScopedRequired
createScopedRequired()

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)

Creates a JWT credentials instance using an API Key for authentication.

Parameters :
Name Type Optional Description
apiKey string No

The API Key in string form.

Returns : void
fromJSON
fromJSON(json: JWTInput)

Create a JWT credentials instance using the given input options.

Parameters :
Name Type Optional Description
json JWTInput No

The input object.

Returns : void
fromStream
fromStream(inputStream: stream.Readable, callback: (err: Error | null) => void)
Parameters :
Name Type Optional
inputStream stream.Readable No
callback function No
Returns : void
fromStream
fromStream(inputStream: stream.Readable, callback?: (err?: Error | null) => void)
Parameters :
Name Type Optional
inputStream stream.Readable No
callback function Yes
Returns : void | Promise
fromStream
fromStream(inputStream: stream.Readable)

Create a JWT credentials instance using the given input stream.

Parameters :
Name Type Optional Description
inputStream stream.Readable No

The input stream.

Returns : Promise<void>
Async getCredentials
getCredentials()

Using the key or keyFile on the JWT client, obtain an object that contains the key and the client email.

generateAuthUrl
generateAuthUrl(opts: GenerateAuthUrlOpts)
Inherited from OAuth2Client
Defined in OAuth2Client:463

Generates URL for consent page landing.

Parameters :
Name Type Optional Default value Description
opts GenerateAuthUrlOpts No {}

Options.

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 :
Name Type Optional
callback GetAccessTokenCallback Yes
Returns : Promise | void
getAccessToken
getAccessToken(callback: GetAccessTokenCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:668
Parameters :
Name Type Optional
callback GetAccessTokenCallback No
Returns : void
getAccessToken
getAccessToken()
Inherited from OAuth2Client
Defined in OAuth2Client:667

Get a non-expired access token, after refreshing if necessary

getFederatedSignonCerts
getFederatedSignonCerts(callback?: GetFederatedSignonCertsCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:1002
Parameters :
Name Type Optional
callback GetFederatedSignonCertsCallback Yes
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.

getFederatedSignonCerts
getFederatedSignonCerts(callback: GetFederatedSignonCertsCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:1001
Parameters :
Name Type Optional
callback GetFederatedSignonCertsCallback No
Returns : void
Async getFederatedSignonCertsAsync
getFederatedSignonCertsAsync()
Inherited from OAuth2Client
Defined in OAuth2Client:1015
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 :
Name Type Optional Description
url string Yes

The optional url being authorized

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 :
Name Type Optional Description
url string | null Yes

the Uri being authorized

Returns : Promise<RequestMetadataResponse>
getRequestMetadata
getRequestMetadata(url: string | null, callback: RequestMetadataCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:708
Parameters :
Name Type Optional
url string | null No
callback RequestMetadataCallback No
Returns : void
getRequestMetadata
getRequestMetadata(url: string | null, callback?: RequestMetadataCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:712
Parameters :
Name Type Optional
url string | null No
callback RequestMetadataCallback Yes
Returns : Promise | void
Static getRevokeTokenUrl
getRevokeTokenUrl(token: string)
Inherited from OAuth2Client
Defined in OAuth2Client:790

Generates an URL to revoke the given token.

Parameters :
Name Type Optional Description
token string No

The existing token to be revoked.

Returns : string
getToken
getToken(options: GetTokenOptions, callback: GetTokenCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:525
Parameters :
Name Type Optional
options GetTokenOptions No
callback GetTokenCallback No
Returns : void
getToken
getToken(codeOrOptions: string | GetTokenOptions, callback?: GetTokenCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:526
Parameters :
Name Type Optional
codeOrOptions string | GetTokenOptions No
callback GetTokenCallback Yes
Returns : Promise | void
getToken
getToken(code: string, callback: GetTokenCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:524
Parameters :
Name Type Optional
code string No
callback GetTokenCallback No
Returns : void
getToken
getToken(code: string)
Inherited from OAuth2Client
Defined in OAuth2Client:522

Gets the access token for the given code.

Parameters :
Name Type Optional Description
code string No

The authorization code.

getToken
getToken(options: GetTokenOptions)
Inherited from OAuth2Client
Defined in OAuth2Client:523
Parameters :
Name Type Optional
options GetTokenOptions No
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 :
Name Type Optional Description
accessToken string No

Required. The Access Token for which you want to get user info.

Returns : Promise<TokenInfo>
refreshAccessToken
refreshAccessToken(callback?: RefreshAccessTokenCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:640
Parameters :
Name Type Optional
callback RefreshAccessTokenCallback Yes
Returns : Promise | void
refreshAccessToken
refreshAccessToken(callback: RefreshAccessTokenCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:639
Parameters :
Name Type Optional
callback RefreshAccessTokenCallback No
Returns : void
refreshAccessToken
refreshAccessToken()
Inherited from OAuth2Client
Defined in OAuth2Client:638

Retrieves the access token using refresh token

request
request(opts: GaxiosOptions, callback?: BodyResponseCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:860
Type parameters :
  • T
Parameters :
Name Type Optional
opts GaxiosOptions No
callback BodyResponseCallback<T> Yes
Returns : GaxiosPromise | void
request
request(opts: GaxiosOptions, callback: BodyResponseCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:859
Type parameters :
  • T
Parameters :
Name Type Optional
opts GaxiosOptions No
callback BodyResponseCallback<T> No
Returns : void
request
request(opts: GaxiosOptions)
Inherited from OAuth2Client
Defined in OAuth2Client:858
Type parameters :
  • T

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 :
Name Type Optional Description
opts GaxiosOptions No

Request options.

Returns : GaxiosPromise<T>

Request object

revokeCredentials
revokeCredentials(callback?: BodyResponseCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:830
Parameters :
Name Type Optional
callback BodyResponseCallback<RevokeCredentialsResult> Yes
Returns : GaxiosPromise | void
revokeCredentials
revokeCredentials(callback: BodyResponseCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:827
Parameters :
Name Type Optional
callback BodyResponseCallback<RevokeCredentialsResult> No
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 :
Name Type Optional
token string No
callback BodyResponseCallback<RevokeCredentialsResult> Yes
Returns : GaxiosPromise | void
revokeToken
revokeToken(token: string)
Inherited from OAuth2Client
Defined in OAuth2Client:800

Revokes the access given to token.

Parameters :
Name Type Optional Description
token string No

The existing token to be revoked.

Returns : GaxiosPromise<RevokeCredentialsResult>
revokeToken
revokeToken(token: string, callback: BodyResponseCallback)
Inherited from OAuth2Client
Defined in OAuth2Client:801
Parameters :
Name Type Optional
token string No
callback BodyResponseCallback<RevokeCredentialsResult> No
Returns : void
verifyIdToken
verifyIdToken(options: VerifyIdTokenOptions, callback?: (err?: Error | null,login?: LoginTicket) => void)
Inherited from OAuth2Client
Defined in OAuth2Client:931
Parameters :
Name Type Optional
options VerifyIdTokenOptions No
callback function Yes
Returns : void | Promise
verifyIdToken
verifyIdToken(options: VerifyIdTokenOptions, callback: (err: Error | null,login: LoginTicket) => void)
Inherited from OAuth2Client
Defined in OAuth2Client:927
Parameters :
Name Type Optional
options VerifyIdTokenOptions No
callback function No
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 :
Name Type Optional Description
options VerifyIdTokenOptions No

that contains all options.

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 :
Name Type Optional Description
jwt string No

The jwt to verify (The ID Token in this case).

certs Certificates No

The array of certs to test the jwt against.

requiredAudience string | string[] No

The audience to test the jwt against.

issuers string[] Yes

The allowed issuers of the jwt (Optional).

maxExpiry number Yes

The max expiry the certificate can be (Optional).

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.');
  }
}

result-matching ""

    No results matching ""