2025-06-12 18:23:49 +00:00
module . exports = {
friendlyName : 'Create android enrollment token' ,
description : 'Creates and returns an enrollment token for an Android enterprise' ,
inputs : {
androidEnterpriseId : {
type : 'string' ,
required : true ,
} ,
} ,
exits : {
2025-10-10 22:11:42 +00:00
success : { description : 'An Android Enterprise enrollment token was returned to the Fleet instance.' } ,
missingAuthHeader : { description : 'This request was missing an authorization header.' , responseType : 'unauthorized' } ,
unauthorized : { description : 'Invalid authentication token' , responseType : 'unauthorized' } ,
notFound : { description : 'No Android enterprise found for this Fleet server.' , responseType : 'notFound' } ,
2025-06-12 18:23:49 +00:00
} ,
fn : async function ( { androidEnterpriseId } ) {
// Extract fleetServerSecret from the Authorization header
let authHeader = this . req . get ( 'authorization' ) ;
let fleetServerSecret ;
if ( authHeader && authHeader . startsWith ( 'Bearer' ) ) {
fleetServerSecret = authHeader . replace ( 'Bearer' , '' ) . trim ( ) ;
} else {
2025-10-10 22:11:42 +00:00
throw 'missingAuthHeader' ;
2025-06-12 18:23:49 +00:00
}
// Authenticate this request
let thisAndroidEnterprise = await AndroidEnterprise . findOne ( {
androidEnterpriseId : androidEnterpriseId ,
} ) ;
// Return a 404 response if no records are found.
if ( ! thisAndroidEnterprise ) {
2025-10-10 22:11:42 +00:00
throw 'notFound' ;
2025-06-12 18:23:49 +00:00
}
// Return an unauthorized response if the provided secret does not match.
if ( thisAndroidEnterprise . fleetServerSecret !== fleetServerSecret ) {
2025-10-10 22:11:42 +00:00
throw 'unauthorized' ;
2025-06-12 18:23:49 +00:00
}
2025-10-06 17:50:42 +00:00
// Check the list of Android Enterprises managed by Fleet to see if this Android Enterprise is still managed.
let isEnterpriseManagedByFleet = await sails . helpers . androidProxy . getIsEnterpriseManagedByFleet ( androidEnterpriseId ) ;
// Return a 404 response if this Android enterprise is no longer managed by Fleet.
if ( ! isEnterpriseManagedByFleet ) {
2025-10-10 22:11:42 +00:00
throw 'notFound' ;
2025-10-06 17:50:42 +00:00
}
2025-06-12 18:23:49 +00:00
let newEnrollmentToken = await sails . helpers . flow . build ( async ( ) => {
let { google } = require ( 'googleapis' ) ;
let androidmanagement = google . androidmanagement ( 'v1' ) ;
let googleAuth = new google . auth . GoogleAuth ( {
scopes : [ 'https://www.googleapis.com/auth/androidmanagement' ] ,
credentials : {
client _email : sails . config . custom . androidEnterpriseServiceAccountEmailAddress , // eslint-disable-line camelcase
private _key : sails . config . custom . androidEnterpriseServiceAccountPrivateKey , // eslint-disable-line camelcase
} ,
} ) ;
// Acquire the google auth client, and bind it to all future calls
let authClient = await googleAuth . getClient ( ) ;
google . options ( { auth : authClient } ) ;
// [?]: https://googleapis.dev/nodejs/googleapis/latest/androidmanagement/classes/Resource$Enterprises$Enrollmenttokens.html#create
let enrollmentTokenCreateResponse = await androidmanagement . enterprises . enrollmentTokens . create ( {
parent : ` enterprises/ ${ androidEnterpriseId } ` ,
2026-03-07 00:06:25 +00:00
// Note: Typically, we use defined inputs instead of accessing req.body directly. This behavior should not be repeated in future Android proxy endpoints.
2025-06-12 18:23:49 +00:00
requestBody : this . req . body ,
} ) ;
return enrollmentTokenCreateResponse . data ;
2025-11-12 21:37:21 +00:00
} ) . intercept ( { status : 429 } , ( err ) => {
// If the Android management API returns a 429 response, log an additional warning that will trigger a help-p1 alert.
sails . log . warn ( ` p1: Android management API rate limit exceeded! ` ) ;
return new Error ( ` When attempting to create an enrollment token for an Android enterprise ( ${ androidEnterpriseId } ), an error occurred. Error: ${ err } ` ) ;
2025-06-12 18:23:49 +00:00
} ) . intercept ( ( err ) => {
2026-02-19 23:46:41 +00:00
return new Error ( ` When attempting to create an enrollment token for an Android enterprise ( ${ androidEnterpriseId } ), an error occurred. Error: ${ require ( 'util' ) . inspect ( err ) } ` ) ;
2025-06-12 18:23:49 +00:00
} ) ;
return newEnrollmentToken ;
}
} ;