Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Google Apps (G Suite), Microsoft Azure AD, GitHub, OKTA, Auth0, Centrify authentication for CloudFront using Lambda@Edge. The original use case for cloudfront-auth was to serve private S3 content over HTTPS without running a proxy server in EC2 to authenticate requests; but cloudfront-auth can be used authenticate requests of any Cloudfront origin configuration.

Description

Upon successful authentication, a cookie (named TOKEN) with the value of a signed JWT is set and the user redirected back to the originally requested path. Upon each request, Lambda@Edge checks the JWT for validity (signature, expiration date, audience and matching hosted domain) and will redirect the user to configured provider's login when their session has timed out.

Usage

If your CloudFront distribution is pointed at a S3 bucket, configure origin access identity so S3 objects can be stored with private permissions. (Origin access identity requires the S3 ACL owner be the account owner. Use our s3-object-owner-monitor Lambda function if writing objects across multiple accounts.)

Enable SSL/HTTPS on your CloudFront distribution; AWS Certificate Manager can be used to provision a no-cost certificate.

Session duration is defined as the number of hours that the JWT is valid for. After session expiration, cloudfront-auth will redirect the user to the configured provider to re-authenticate. RSA keys are used to sign and validate the JWT. If the files id_rsa and id_rsa.pub do not exist they will be automatically generated by the build. To disable all issued JWTs upload a new ZIP using the Lambda Console after deleting the id_rsa and id_rsa.pub files (a new key will be automatically generated).

Identity Provider Guides

Github

  1. Clone or download this repo
  2. Navigate to your organization's profile page, then choose OAuth Apps under Developer settings.
    1. Select New OAuth App
    2. For Authorization callback URL enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
    1. Choose Github as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Session Duration and Organization
      • cloudfront-auth will check that users are a member of the entered Organization.
  4. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Google

  1. Clone or download this repo
  2. Go to the Credentials tab of your Google developers console
    1. Create a new Project
    2. Create an OAuth Client ID from the Create credentials menu
    3. Select Web application for the Application type
    4. Under Authorized redirect URIs, enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Google as the authorization method and enter the values for Client ID, Client Secret, Redirect URI, Hosted Domain and Session Duration
  5. Select the preferred authentication method
    1. Hosted Domain (verify email's domain matches that of the given hosted domain)
    2. JSON Email Lookup
      1. Enter your JSON Email Lookup URL (example below) that consists of a single JSON array of emails to search through
    3. Google Groups Lookup
      1. Use Google Groups to authorize users
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Microsoft Azure

  1. Clone or download this repo
  2. In your Azure portal, go to Azure Active Directory and select App registrations
    1. Create a new application registration with an application type of Web app / api
    2. Once created, go to your application Settings -> Keys and make a new key with your desired duration. Click save and copy the value. This will be your client_secret
    3. Above where you selected Keys, go to Reply URLs and enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose Microsoft as the authorization method and enter the values for Tenant, Client ID (Application ID), Client Secret (previously created key), Redirect URI and Session Duration
  5. Select the preferred authentication method
    1. Azure AD Membership (default)
    2. JSON Username Lookup
      1. Enter your JSON Username Lookup URL (example below) that consists of a single JSON array of usernames to search through
  6. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Web application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id and Client Secret from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA as the authorization method and enter the values for Base URL (Org URL), Client ID, Client Secret, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Auth0

  1. Clone or download this repo
  2. Go to the Dashboard of your Auth0 admin page
    1. Click New Application
    2. Select Regular Web App and click Create.
    3. Now select an application type and follow the steps for 'Quick Start' or use your own app.
    4. Go to application Settings and enter required details. In Allowed Callback URLs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  3. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  4. Choose AUTH0 as the authorization method and enter the values for Base URL (Auth0 Domain), Client ID, Client Secret, Redirect URI, and Session Duration
  5. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Centrify

  1. Clone or download this repo
  2. Go to the Dashboard of your Centrify admin page
    1. Click Web Apps from the LHS.
    2. Click Add Web App and select the Custom Tab.
    3. Add an OpenID Connect webapp and click Yes to confirm.
  3. Fill in naming and logo information and then switch to the Trust tab.
  4. Enter service provider information. In Authorized Redirect URIs enter your Cloudfront hostname with your preferred path value for the authorization callback. Example: https://my-cloudfront-site.example.com/_callback
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose CENTRIFY as the authorization method and enter the values for Base URL (Centrify Resource application URL), Client ID, Client Secret, Redirect URI, and Session Duration (which is available from the Tokens tab).
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

OKTA Native

  1. Clone or download this repo
  2. Sign in to OKTA with your administrator account and navigate to the Applications tab.
  3. Add Application
    1. Select the Native application type
    2. Base URI: CloudFront distribution domain name (https://{cf-endpoint}.cloudfront.net)
    3. Login Redirect URI: CloudFront distribution domain name with callback path (https://{cf-endpoint}.cloudfront.net/_callback)
    4. Group Assignments: Optional
    5. Grant Type Allowed: Authorization Code
    6. Done
  4. Gather the following information for Lambda configuration
    1. Client Id from the application created in our previous step (can be found at the bottom of the general tab)
    2. Base Url
      1. This is named the 'Org URL' and can be found in the top right of the Dashboard tab.
  5. Execute ./build.sh in the downloaded directory. NPM will run to download dependencies and a RSA key will be generated.
  6. Choose OKTA Native as the authorization method and enter the values for Base URL (Org URL), Client ID, PKCE Code Verifier Length, Redirect URI, and Session Duration
  7. Upload the resulting zip file found in your distribution folder using the AWS Lambda console and jump to the configuration step

Configure Lambda and CloudFront

Manual DeploymentorAWS SAM Deployment

Authorization Method Examples

Testing

Detailed instructions on testing your function can be found in the Wiki.

Build Requirements

Contributing

All contributions are welcome. Please create an issue in order open up communication with the community.

When implementing a new flow or using an already implemented flow, be sure to follow the same style used in build.js. The config.json file should have an object for each request made. For example, openid.index.js converts config.AUTH_REQUEST and config.TOKEN_REQUEST to querystrings for simplified requests (after adding dynamic variables such as state or nonce). For implementations that are not generic (most), endpoints are hardcoded in to the config (or discovery documents).

Be considerate of our limitations. The zipped function can be no more than 1MB in size and execution cannot take longer than 5 seconds, so we must pay close attention to the size of our dependencies and complexity of operations.

About

An AWS CloudFront Lambda@Edge function to authenticate requests using Google Apps, Microsoft, Auth0, OKTA, and GitHub login

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages