├── .editorconfig ├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── config.js ├── helpers.js ├── index.js ├── main.js ├── package-lock.json ├── package.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | # A special property that should be specified at the top of the file outside of 4 | # any sections. Set to true to stop .editor config file search on current file 5 | root = true 6 | 7 | [*] 8 | # Indentation style 9 | # Possible values - tab, space 10 | indent_style = space 11 | 12 | # Indentation size in single-spaced characters 13 | # Possible values - an integer, tab 14 | indent_size = 2 15 | 16 | # Line ending file format 17 | # Possible values - lf, crlf, cr 18 | end_of_line = lf 19 | 20 | # File character encoding 21 | # Possible values - latin1, utf-8, utf-16be, utf-16le 22 | charset = utf-8 23 | 24 | # Denotes whether to trim whitespace at the end of lines 25 | # Possible values - true, false 26 | trim_trailing_whitespace = true 27 | 28 | # Denotes whether file should end with a newline 29 | # Possible values - true, false 30 | insert_final_newline = true 31 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | #common settings that generally should always be used with your language specific settings 2 | 3 | # Auto detect text files and perform LF normalization 4 | # http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ 5 | * text=auto eol=lf 6 | 7 | # 8 | # The above will handle all files NOT found below 9 | # 10 | 11 | # Documents 12 | *.doc binary 13 | *.DOC binary 14 | *.docx binary 15 | *.DOCX binary 16 | *.dot binary 17 | *.DOT binary 18 | *.pdf binary 19 | *.PDF binary 20 | *.rtf binary 21 | *.RTF binary 22 | *.md text 23 | *.adoc text 24 | *.textile text 25 | *.mustache text 26 | *.csv text 27 | *.tab text 28 | *.tsv text 29 | *.sql text 30 | 31 | # Graphics 32 | *.png binary 33 | *.jpg binary 34 | *.jpeg binary 35 | *.gif binary 36 | *.tif binary 37 | *.tiff binary 38 | *.ico binary 39 | *.svg binary 40 | *.eps binary 41 | 42 | # source code 43 | *.php text 44 | *.css text 45 | *.sass text 46 | *.scss text 47 | *.less text 48 | *.styl text 49 | *.js text 50 | *.ts text 51 | *.coffee text 52 | *.json text 53 | *.htm text 54 | *.html text 55 | *.xml text 56 | *.svg text 57 | *.txt text 58 | *.ini text 59 | *.inc text 60 | *.pl text 61 | *.rb text 62 | *.py text 63 | *.scm text 64 | *.sql text 65 | *.sh text 66 | *.bat text 67 | 68 | # templates 69 | *.ejs text 70 | *.hbt text 71 | *.jade text 72 | *.haml text 73 | *.hbs text 74 | *.dot text 75 | *.tmpl text 76 | *.phtml text 77 | *.latte text 78 | 79 | # server config 80 | .htaccess text 81 | 82 | # git config 83 | .gitattributes text 84 | .gitignore text 85 | .gitconfig text 86 | 87 | # code analysis config 88 | .jshintrc text 89 | .jscsrc text 90 | .jshintignore text 91 | .csslintrc text 92 | .eslintrc text 93 | .babelrc text 94 | .flowconfig 95 | 96 | # misc config 97 | *.yaml text 98 | *.yml text 99 | .editorconfig text 100 | 101 | # build config 102 | *.npmignore text 103 | *.bowerrc text 104 | 105 | # Heroku 106 | Procfile text 107 | .slugignore text 108 | 109 | # Documentation 110 | *.md text 111 | LICENSE text 112 | AUTHORS text 113 | 114 | # (binary is a macro for -text -diff) 115 | *.png binary 116 | *.jpg binary 117 | *.jpeg binary 118 | *.gif binary 119 | *.ico binary 120 | *.mov binary 121 | *.mp4 binary 122 | *.mp3 binary 123 | *.flv binary 124 | *.fla binary 125 | *.swf binary 126 | *.gz binary 127 | *.zip binary 128 | *.7z binary 129 | *.ttf binary 130 | *.eot binary 131 | *.woff binary 132 | *.woff2 binary 133 | *.pyc binary 134 | *.pdf binary 135 | 136 | 137 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_STORE 2 | *.log 3 | node_modules 4 | package.zip 5 | .idea/** 6 | .idea/**/ 7 | !.idea/codeStyleSettings.xml 8 | .yarn-cache 9 | *.swp 10 | dist/ 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Expero Inc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Lambda@Edge function which will protect static websites hosted in S3 and served by Cloudfront. Visitors to the sites 2 | will be required to authenticate with Auth0 before they can access the site. 3 | 4 | [This article](https://www.experoinc.com/post/serverless-authentication) is based upon this code. 5 | 6 | This one lambda is meant to protect multiple sites. 7 | 8 | ## First Time Use Steps 9 | 10 | ### Create an Auth Config S3 Bucket 11 | 12 | The lambda is meant to protect multiple sites. Thus it uses an S3 bucket to maintain the configuration for each 13 | protected site. 14 | 15 | Login to AWS and create an S3 bucket to hold these configurations. 16 | 17 | ### Edit `config.js` and tell it the name of your S3 bucket. 18 | 19 | Find this code in `config.js` 20 | 21 | ```javascript 22 | const params = { 23 | Bucket: 'auth-config.experoinc.com', 24 | Key: configFileName 25 | }; 26 | ``` 27 | 28 | Replace the bucket name (`auth-config.experoinc.com`) with the name of the S3 bucket you just created. 29 | 30 | ### Add your first site config to the bucket 31 | 32 | The lambda looks for configurations based upon the request hostname. So if your site is being served as 33 | `https://my-awesome-site.com/foo`, then the lambda will look for a configuration file in the S3 bucket 34 | called `my-awesome-site.com.json`. If your site is hosted under multiple hostnames, then you'd have to add 35 | a configuration for each hostname. 36 | 37 | Here is what an auth configuration file looks like: 38 | 39 | ```json 40 | { 41 | "certificate": "-----BEGIN CERTIFICATE-----\nxxxxxxxxxxxxxxxx\nyyyyyyyyyyyyyyy\nxxxxxxxxx\nyyyyyyyyyyyy\nxxxxxxx\nyyyyyy\nxxxxxx\nyyyyyyy\nxxxxxx\nyyyyyy8kTow==\n-----END CERTIFICATE-----", 42 | "AUTH0_CLIENT_ID": "xlkihjaskjhaskjjh", 43 | "AUTH0_CLIENT_SECRET": "sdlkjsdlkjsdlkjsdl/kjsd;lklksdjhlksjdh", 44 | "AUTH0_ALGORITHM": "RS256", 45 | "AUTH0_DOMAIN": "YOURDOMAIN.auth0.com", 46 | "AUTH0_HOST": "https://YOURDOMAIN.auth0.com", 47 | "AUTH0_LOGIN_URL": "https://YOURDOMAIN.auth0.com/login", 48 | "CALLBACK_PATH": "/logincb" 49 | } 50 | ``` 51 | 52 | Here is a description of each field: 53 | 54 | * `certificate` - the public RSA key. Retrieve from `https://.auth0.com/pem`. Make sure and replace all newlines with `\n` when pasting into the JSON string. Make sure you do not have any embedded spaces! 55 | * `AUTH0_CLIENT_ID` - the client id of the Auth0 Applicaton you are using to protect your site. Get from your Auth0 dashboard 56 | * `AUTH0_CLIENT_SECRET` - the client secret of the Auth0 Application. 57 | * `AUTH0_CLIENT_ALGORITHM` - either `"RS256"` or `"HS256"` depending on how your Auth0 application is configured 58 | * `AUTH0_DOMAIN` - your Auth0 domain, aka `your-auth0-tenant.auth0.com` 59 | * `AUTH0_HOST` - the url to your auth0 tenant aka `https://your-auth0-tenant.auth0.com` 60 | * `AUTH0_LOGIN_URL` - the url to your app's login page 61 | * `CALLBACK_PATH` - the callback url the lambda should listen on for login responses from Auth0. Leave as `"/logincb"` unless that conflicts with some route in your app. 62 | 63 | ### Configure your Auth0 App 64 | 65 | There's just a few things you need to do in Auth0: 66 | 67 | * Add the callback url to your Auth0 App's list of *Allowed Callback Urls*. This should be the same callback path configured in the previous step. Example: `https://my-awesome-site.com/logincb` 68 | * Go into Advanced options for your Auth0 app, and disable OIDC-Conformant on the OAuth tab. (the lambda method is not currently ODIC-Conformant) 69 | 70 | 71 | ### Add the Lambda to AWS 72 | 73 | Build the distribution 74 | * `yarn` - install dependencies 75 | * `yarn run build` to build package.zip 76 | 77 | Create the Lambda 78 | 79 | * Goto Lamba in the AWS Console and create a new Lambda "From Scratch" 80 | * Choose Node.js runtime 81 | * Give your function a name 82 | * Choose an execution role 83 | * Ensure that whatever role you assign here has permission to *read* from config S3 bucket you made previously 84 | * Create the Function 85 | * In the new screen, goto Function Code and choose `Upload a zip file` 86 | * Upload the `package.zip` you just built. 87 | * Leave `index.handler` selected as the Handler 88 | * Publish a new version of the function 89 | * Deploy the function to Lambda@Edge 90 | * Configure new CloudFront Trigger 91 | * Select the Cloudfront distribution of your website 92 | * Change the CloudFront event to `Viewer Request` 93 | * Deploy 94 | 95 | Wait a few minutes for the function to be distributed to the edge servers and for your cloudfront settings to update. Then visit your website. If all goes well, you'll get an auth0 prompt to login. 96 | 97 | ## Adding additional sites 98 | 99 | * Add a new config json file to the S3 bucket for the new site 100 | * Edit the Cloudfront distribution and edit the `Behavior` 101 | * Add a `Lambda Function Associations`: 102 | * Type: Viewer Request 103 | * Lambda Function ARN: The ARN for the lambda function you deployed 104 | * Include Body: No 105 | * Save the changes and wait for them to propagate to the edge servers 106 | 107 | 108 | ## List of Improvements To Make 109 | 110 | * Change the auth workflow so that it is OIDC-Comformant (this should eliminate the need for the client secret in the config) 111 | * Improve the code workflow to fetch public keys on demand based on the standaed OAuth endpoints (eliminate the need to put the public key in the config) 112 | * Change the code to work correctly with the `authorize` endpoint instead of login endpoint (conform to the standard better) 113 | * Change the config keys to be more generic (not auth0-specific) 114 | 115 | With those improvements, this function should be able to work with any standard OAuth provider, not just Auth0. 116 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk'); 2 | 3 | const s3 = new AWS.S3(); 4 | const cache = {}; 5 | 6 | function getConfig(configFileName, callback) { 7 | //configuring parameters 8 | const params = { 9 | Bucket: 'auth-config.experoinc.com', 10 | Key: configFileName 11 | }; 12 | 13 | s3.getObject(params, function (err, data) { 14 | if (err) { 15 | callback(err, null); 16 | } 17 | else { 18 | const config = data && data.Body && JSON.parse(data.Body.toString()); 19 | callback(null, config); 20 | } 21 | }); 22 | } 23 | 24 | function getConfigCached(request, callback) { 25 | const configFileName = `${request.headers.host[0].value}.json`; 26 | const entry = cache[configFileName]; 27 | if (entry && ((Date.now() - entry.time) < (5 * 60 * 1000))) // if entry is less than 5 minutes old 28 | { 29 | return callback(null, entry); 30 | } 31 | 32 | getConfig(configFileName, (err, result) => { 33 | if (!err) { 34 | result.time = Date.now(); 35 | cache[configFileName] = result; 36 | } 37 | callback(err, result); 38 | }); 39 | } 40 | 41 | module.exports = getConfigCached; 42 | -------------------------------------------------------------------------------- /helpers.js: -------------------------------------------------------------------------------- 1 | const escape = require("lodash.escape"); 2 | 3 | function makeRedirect(newLocation, cookies) { 4 | const result = { 5 | status: '302', 6 | statusDescription: 'Found', 7 | headers: { 8 | location: [{ 9 | key: 'Location', 10 | value: newLocation, 11 | }], 12 | }, 13 | }; 14 | 15 | if (cookies) { 16 | result.headers["set-cookie"] = cookies.map(c => ({key: "set-cookie", value: `${c.name}=${c.value}`})); 17 | } 18 | 19 | return result; 20 | } 21 | 22 | function makeResponse(status, statusText, title, message) { 23 | const body = ` 24 | 25 | 26 | 27 | 28 | ${escape(title)} 29 | 30 | 31 |

${escape(message)}

32 | 33 | `; 34 | 35 | const result = { 36 | status: status, 37 | statusText: statusText, 38 | body: body 39 | }; 40 | 41 | return result; 42 | } 43 | 44 | module.exports = { 45 | redirect: makeRedirect, 46 | respond: makeResponse, 47 | }; 48 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const querystring = require('querystring'); 4 | const https = require("https"); 5 | const jsonwebtoken = require('jsonwebtoken'); 6 | const getConfigCached = require("./config"); 7 | const {redirect, respond} = require("./helpers"); 8 | 9 | const PUBLIC_PATHS = [/\/favicons\//]; 10 | 11 | function parseCookies(headers) { 12 | const parsedCookie = {}; 13 | if (headers.cookie) { 14 | headers.cookie[0].value.split(';').forEach((cookie) => { 15 | if (cookie) { 16 | const parts = cookie.split('='); 17 | parsedCookie[parts[0].trim()] = parts[1].trim(); 18 | } 19 | }); 20 | } 21 | return parsedCookie; 22 | } 23 | 24 | function validateToken(config, token) { 25 | try { 26 | const decoded = jsonwebtoken.verify(token, config.certificate, { 27 | algorithms: [config.AUTH0_ALGORITHM], 28 | audience: config.AUTH0_CLIENT_ID, 29 | }); 30 | 31 | return true; 32 | } 33 | catch (err) { 34 | return false; 35 | } 36 | } 37 | 38 | function validateCookie(config, cookie) { 39 | return !!cookie && validateToken(config, cookie); 40 | } 41 | 42 | function loginCallback(config, request, callback) { 43 | if (request.uri !== config.CALLBACK_PATH) { 44 | return false; 45 | } // unhandled 46 | 47 | let params; 48 | try { 49 | params = querystring.parse(request.querystring); 50 | if (params.error) { 51 | callback(null, respond(401, "Unauthorized", params.error, params.error_description)); 52 | return true; // handled 53 | } 54 | if (!params.code) { 55 | return false; // unhandled 56 | } 57 | } 58 | catch (err) { 59 | return false; // unhandled 60 | } 61 | 62 | // Call Auth0 to get JWT token 63 | const headers = request.headers; 64 | const postData = querystring.stringify({ 65 | client_id: config.AUTH0_CLIENT_ID, 66 | redirect_uri: `https://${headers.host[0].value}${config.CALLBACK_PATH}`, 67 | client_secret: config.AUTH0_CLIENT_SECRET, 68 | code: params.code, 69 | grant_type: "authorization_code" 70 | }); 71 | const postOptions = { 72 | host: config.AUTH0_DOMAIN, 73 | port: 443, 74 | path: "/oauth/token", 75 | method: "POST", 76 | headers: { 77 | 'Content-Type': 'application/x-www-form-urlencoded', 78 | 'Content-Length': postData.length 79 | } 80 | }; 81 | const req = https.request(postOptions, res => { 82 | if (res.statusCode >= 300) { 83 | return callback(null, respond(500, "Internal Server Error", "Bad token response", `Bad Token Response: ${res.statusCode} ${res.statusText}`)); 84 | } 85 | 86 | let body = ""; 87 | res.on('data', d => body += d); 88 | res.on('end', () => { 89 | try { 90 | const json = JSON.parse(body); 91 | const token = json.id_token; 92 | 93 | if (!token) { 94 | return callback(null, respond(401, "Unauthorized", "Unauthorized", body)); 95 | } 96 | 97 | // store this in a cookie, then redirect the user 98 | const dest = `https://${headers.host[0].value}${params.dest || "/"}`; 99 | callback(null, redirect(dest, [{name: "session-token", value: token}])); 100 | } 101 | catch (e) { 102 | callback(e, null); 103 | } 104 | }); 105 | }); 106 | req.on("error", e => callback(e, null)); 107 | req.write(postData); 108 | req.end(); 109 | 110 | return true; // handled 111 | } 112 | 113 | function redirectIfNotAuthenticated(config, request, callback) { 114 | const headers = request.headers; 115 | 116 | /* Check for session-id in request cookie in viewer-request event, 117 | * if session-id is absent, redirect the user to sign in page with original 118 | * request sent as redirect_url in query params. 119 | */ 120 | 121 | /* Check for session-id in cookie, if present then proceed with request */ 122 | const parsedCookies = parseCookies(headers); 123 | if (validateCookie(config, parsedCookies && parsedCookies['session-token'])) { 124 | return false; // not handled 125 | } 126 | 127 | // User is not authenticated. 128 | /* URI encode the original request so we can send as query param for when user is finally logged in */ 129 | const encodedRedirectUrl = encodeURIComponent(request.querystring ? `${request.uri}?${request.querystring}` : request.uri); 130 | const callbackUrl = `https://${headers.host[0].value}${config.CALLBACK_PATH}?dest=${encodedRedirectUrl}`; 131 | const encodedCallback = encodeURIComponent(callbackUrl); 132 | const redirectUrl = `${config.AUTH0_LOGIN_URL}?client=${config.AUTH0_CLIENT_ID}&redirect_uri=${encodedCallback}`; 133 | 134 | callback(null, redirect(redirectUrl, [{name: "session-token", value: ""}])); 135 | 136 | return true; // handled 137 | } 138 | 139 | function allowPublicPaths(config, request, callback) { 140 | if (PUBLIC_PATHS.find(pattern => pattern.test(request.uri))) { 141 | callback(null, request); 142 | return true; 143 | } 144 | } 145 | 146 | function requireConfig(config, request, callback) { 147 | if (!config) { 148 | callback(null, respond(500, "Internal Server Error", "Authentication Not Configured", "Authentication not configured for this website")); 149 | return true; // handled 150 | } 151 | } 152 | 153 | exports.handler = function (event, context, callback) { 154 | const request = event.Records[0].cf.request; 155 | 156 | getConfigCached(request, function (err, config) { 157 | if (err) { 158 | callback(err, null); 159 | } 160 | else if ( 161 | !requireConfig(config, request, callback) && 162 | !allowPublicPaths(config, request, callback) && 163 | !loginCallback(config, request, callback) && 164 | !redirectIfNotAuthenticated(config, request, callback)) { 165 | callback(null, request); 166 | } 167 | }); 168 | }; 169 | 170 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const index = require("./index"); 2 | 3 | const event = { 4 | "Records": [ 5 | { 6 | "cf": { 7 | "config": { 8 | "distributionDomainName": "d123.cloudfront.net", 9 | "distributionId": "EDFDVBD6EXAMPLE", 10 | "eventType": "viewer-request", 11 | "requestId": "MRVMF7KydIvxMWfJIglgwHQwZsbG2IhRJ07sn9AkKUFSHS9EXAMPLE==" 12 | }, 13 | "request": { 14 | "body": { 15 | "action": "read-only", 16 | "data": "eyJ1c2VybmFtZSI6IkxhbWJkYUBFZGdlIiwiY29tbWVudCI6IlRoaXMgaXMgcmVxdWVzdCBib2R5In0=", 17 | "encoding": "base64", 18 | "inputTruncated": false 19 | }, 20 | "clientIp": "2001:0db8:85a3:0:0:8a2e:0370:7334", 21 | "querystring": "size=large", 22 | "uri": "/picture.jpg", 23 | "method": "GET", 24 | "headers": { 25 | "host": [ 26 | { 27 | "key": "Host", 28 | "value": "miranda.experolabs.com" 29 | } 30 | ], 31 | "user-agent": [ 32 | { 33 | "key": "User-Agent", 34 | "value": "curl/7.51.0" 35 | } 36 | ] 37 | }, 38 | "origin": { 39 | "custom": { 40 | "customHeaders": { 41 | "my-origin-custom-header": [ 42 | { 43 | "key": "My-Origin-Custom-Header", 44 | "value": "Test" 45 | } 46 | ] 47 | }, 48 | "domainName": "example.com", 49 | "keepaliveTimeout": 5, 50 | "path": "/custom_path", 51 | "port": 443, 52 | "protocol": "https", 53 | "readTimeout": 5, 54 | "sslProtocols": [ 55 | "TLSv1", 56 | "TLSv1.1" 57 | ] 58 | }, 59 | "s3": { 60 | "authMethod": "origin-access-identity", 61 | "customHeaders": { 62 | "my-origin-custom-header": [ 63 | { 64 | "key": "My-Origin-Custom-Header", 65 | "value": "Test" 66 | } 67 | ] 68 | }, 69 | "domainName": "miranda-storybook.s3.amazonaws.com", 70 | "path": "miranda-storybook.s3.amazonaws.com", 71 | "region": "us-east-1" 72 | } 73 | } 74 | } 75 | } 76 | } 77 | ] 78 | }; 79 | 80 | index.handler(event, null, function(err, data){ 81 | console.log('done', err, data); 82 | }); 83 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cf-trigger-auth0", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "aws-sdk": { 8 | "version": "2.397.0", 9 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.397.0.tgz", 10 | "integrity": "sha512-Yxt/iL8h1hNkCsBrgjZICnaIyT+q2xR9HNMii1sibmm8iIAg7Gcz/xELNgBEdGos2sWhcgYQVsp6ePbaMgpiKQ==", 11 | "dev": true, 12 | "requires": { 13 | "buffer": "4.9.1", 14 | "events": "1.1.1", 15 | "ieee754": "1.1.8", 16 | "jmespath": "0.15.0", 17 | "querystring": "0.2.0", 18 | "sax": "1.2.1", 19 | "url": "0.10.3", 20 | "uuid": "3.3.2", 21 | "xml2js": "0.4.19" 22 | } 23 | }, 24 | "base64-js": { 25 | "version": "1.3.0", 26 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 27 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", 28 | "dev": true 29 | }, 30 | "buffer": { 31 | "version": "4.9.1", 32 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 33 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 34 | "dev": true, 35 | "requires": { 36 | "base64-js": "^1.0.2", 37 | "ieee754": "^1.1.4", 38 | "isarray": "^1.0.0" 39 | } 40 | }, 41 | "buffer-equal-constant-time": { 42 | "version": "1.0.1", 43 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 44 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 45 | }, 46 | "ecdsa-sig-formatter": { 47 | "version": "1.0.10", 48 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", 49 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", 50 | "requires": { 51 | "safe-buffer": "^5.0.1" 52 | } 53 | }, 54 | "events": { 55 | "version": "1.1.1", 56 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 57 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 58 | "dev": true 59 | }, 60 | "ieee754": { 61 | "version": "1.1.8", 62 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 63 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", 64 | "dev": true 65 | }, 66 | "isarray": { 67 | "version": "1.0.0", 68 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 69 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 70 | "dev": true 71 | }, 72 | "jmespath": { 73 | "version": "0.15.0", 74 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 75 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", 76 | "dev": true 77 | }, 78 | "jsonwebtoken": { 79 | "version": "8.4.0", 80 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.4.0.tgz", 81 | "integrity": "sha512-coyXjRTCy0pw5WYBpMvWOMN+Kjaik2MwTUIq9cna/W7NpO9E+iYbumZONAz3hcr+tXFJECoQVrtmIoC3Oz0gvg==", 82 | "requires": { 83 | "jws": "^3.1.5", 84 | "lodash.includes": "^4.3.0", 85 | "lodash.isboolean": "^3.0.3", 86 | "lodash.isinteger": "^4.0.4", 87 | "lodash.isnumber": "^3.0.3", 88 | "lodash.isplainobject": "^4.0.6", 89 | "lodash.isstring": "^4.0.1", 90 | "lodash.once": "^4.0.0", 91 | "ms": "^2.1.1" 92 | } 93 | }, 94 | "jwa": { 95 | "version": "1.2.0", 96 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.2.0.tgz", 97 | "integrity": "sha512-Grku9ZST5NNQ3hqNUodSkDfEBqAmGA1R8yiyPHOnLzEKI0GaCQC/XhFmsheXYuXzFQJdILbh+lYBiliqG5R/Vg==", 98 | "requires": { 99 | "buffer-equal-constant-time": "1.0.1", 100 | "ecdsa-sig-formatter": "1.0.10", 101 | "safe-buffer": "^5.0.1" 102 | } 103 | }, 104 | "jws": { 105 | "version": "3.2.1", 106 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz", 107 | "integrity": "sha512-bGA2omSrFUkd72dhh05bIAN832znP4wOU3lfuXtRBuGTbsmNmDXMQg28f0Vsxaxgk4myF5YkKQpz6qeRpMgX9g==", 108 | "requires": { 109 | "jwa": "^1.2.0", 110 | "safe-buffer": "^5.0.1" 111 | } 112 | }, 113 | "lodash.escape": { 114 | "version": "4.0.1", 115 | "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", 116 | "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=" 117 | }, 118 | "lodash.includes": { 119 | "version": "4.3.0", 120 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 121 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 122 | }, 123 | "lodash.isboolean": { 124 | "version": "3.0.3", 125 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 126 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 127 | }, 128 | "lodash.isinteger": { 129 | "version": "4.0.4", 130 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 131 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 132 | }, 133 | "lodash.isnumber": { 134 | "version": "3.0.3", 135 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 136 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 137 | }, 138 | "lodash.isplainobject": { 139 | "version": "4.0.6", 140 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 141 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 142 | }, 143 | "lodash.isstring": { 144 | "version": "4.0.1", 145 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 146 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 147 | }, 148 | "lodash.once": { 149 | "version": "4.1.1", 150 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 151 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 152 | }, 153 | "ms": { 154 | "version": "2.1.1", 155 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 156 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 157 | }, 158 | "punycode": { 159 | "version": "1.3.2", 160 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 161 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 162 | "dev": true 163 | }, 164 | "querystring": { 165 | "version": "0.2.0", 166 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 167 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 168 | "dev": true 169 | }, 170 | "safe-buffer": { 171 | "version": "5.1.2", 172 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 173 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 174 | }, 175 | "sax": { 176 | "version": "1.2.1", 177 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 178 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", 179 | "dev": true 180 | }, 181 | "url": { 182 | "version": "0.10.3", 183 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 184 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 185 | "dev": true, 186 | "requires": { 187 | "punycode": "1.3.2", 188 | "querystring": "0.2.0" 189 | } 190 | }, 191 | "uuid": { 192 | "version": "3.3.2", 193 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 194 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 195 | "dev": true 196 | }, 197 | "xml2js": { 198 | "version": "0.4.19", 199 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 200 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 201 | "dev": true, 202 | "requires": { 203 | "sax": ">=0.6.0", 204 | "xmlbuilder": "~9.0.1" 205 | } 206 | }, 207 | "xmlbuilder": { 208 | "version": "9.0.7", 209 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 210 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 211 | "dev": true 212 | } 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cf-trigger-auth0", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "private": true, 7 | "dependencies": { 8 | "jsonwebtoken": "^8.1.1", 9 | "lodash.escape": "^4.0.1" 10 | }, 11 | "scripts": { 12 | "prebuild": "rimraf dist && mkdir dist && yarn install --production=true --modules-folder dist/node_modules && cp *.js dist", 13 | "build": "rm -f package.zip && cd dist && zip -r ../package.zip ." 14 | }, 15 | "devDependencies": { 16 | "aws-sdk": "^2.397.0", 17 | "rimraf": "^3.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | aws-sdk@^2.397.0: 6 | version "2.578.0" 7 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.578.0.tgz#afba0c4107869ea4da092e9801d24b057e043b95" 8 | integrity sha512-QOot7ha8J+w+AQf1UNzpGpbcZtCaK/mqjenG177ybm2nvm00a4PKa5dz/kF/bYi2qMx9yJmiQ17kn32Q5ar8Kg== 9 | dependencies: 10 | buffer "^4.9.1" 11 | events "^1.1.1" 12 | ieee754 "^1.1.13" 13 | jmespath "^0.15.0" 14 | querystring "^0.2.0" 15 | sax "^1.2.1" 16 | url "^0.10.3" 17 | uuid "^3.3.2" 18 | xml2js "^0.4.19" 19 | 20 | balanced-match@^1.0.0: 21 | version "1.0.0" 22 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 23 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 24 | 25 | base64-js@^1.0.2: 26 | version "1.3.1" 27 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 28 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 29 | 30 | base64url@2.0.0, base64url@^2.0.0: 31 | version "2.0.0" 32 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" 33 | 34 | brace-expansion@^1.1.7: 35 | version "1.1.11" 36 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 37 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 38 | dependencies: 39 | balanced-match "^1.0.0" 40 | concat-map "0.0.1" 41 | 42 | buffer-equal-constant-time@1.0.1: 43 | version "1.0.1" 44 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 45 | 46 | buffer@^4.9.1: 47 | version "4.9.2" 48 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" 49 | integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== 50 | dependencies: 51 | base64-js "^1.0.2" 52 | ieee754 "^1.1.4" 53 | isarray "^1.0.0" 54 | 55 | concat-map@0.0.1: 56 | version "0.0.1" 57 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 58 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 59 | 60 | define-properties@^1.1.2, define-properties@^1.1.3: 61 | version "1.1.3" 62 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 63 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 64 | dependencies: 65 | object-keys "^1.0.12" 66 | 67 | ecdsa-sig-formatter@1.0.9: 68 | version "1.0.9" 69 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" 70 | dependencies: 71 | base64url "^2.0.0" 72 | safe-buffer "^5.0.1" 73 | 74 | es-abstract@^1.5.1: 75 | version "1.16.2" 76 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34" 77 | integrity sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA== 78 | dependencies: 79 | es-to-primitive "^1.2.1" 80 | function-bind "^1.1.1" 81 | has "^1.0.3" 82 | has-symbols "^1.0.1" 83 | is-callable "^1.1.4" 84 | is-regex "^1.0.4" 85 | object-inspect "^1.7.0" 86 | object-keys "^1.1.1" 87 | string.prototype.trimleft "^2.1.0" 88 | string.prototype.trimright "^2.1.0" 89 | 90 | es-to-primitive@^1.2.1: 91 | version "1.2.1" 92 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 93 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 94 | dependencies: 95 | is-callable "^1.1.4" 96 | is-date-object "^1.0.1" 97 | is-symbol "^1.0.2" 98 | 99 | events@^1.1.1: 100 | version "1.1.1" 101 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 102 | integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= 103 | 104 | fs.realpath@^1.0.0: 105 | version "1.0.0" 106 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 107 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 108 | 109 | function-bind@^1.1.1: 110 | version "1.1.1" 111 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 112 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 113 | 114 | glob@^7.1.3: 115 | version "7.1.6" 116 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 117 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 118 | dependencies: 119 | fs.realpath "^1.0.0" 120 | inflight "^1.0.4" 121 | inherits "2" 122 | minimatch "^3.0.4" 123 | once "^1.3.0" 124 | path-is-absolute "^1.0.0" 125 | 126 | has-symbols@^1.0.1: 127 | version "1.0.1" 128 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 129 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 130 | 131 | has@^1.0.1, has@^1.0.3: 132 | version "1.0.3" 133 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 134 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 135 | dependencies: 136 | function-bind "^1.1.1" 137 | 138 | ieee754@^1.1.13, ieee754@^1.1.4: 139 | version "1.1.13" 140 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 141 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 142 | 143 | inflight@^1.0.4: 144 | version "1.0.6" 145 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 146 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 147 | dependencies: 148 | once "^1.3.0" 149 | wrappy "1" 150 | 151 | inherits@2: 152 | version "2.0.4" 153 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 154 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 155 | 156 | is-callable@^1.1.4: 157 | version "1.1.4" 158 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 159 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 160 | 161 | is-date-object@^1.0.1: 162 | version "1.0.1" 163 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 164 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 165 | 166 | is-regex@^1.0.4: 167 | version "1.0.4" 168 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 169 | integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= 170 | dependencies: 171 | has "^1.0.1" 172 | 173 | is-symbol@^1.0.2: 174 | version "1.0.3" 175 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 176 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 177 | dependencies: 178 | has-symbols "^1.0.1" 179 | 180 | isarray@^1.0.0: 181 | version "1.0.0" 182 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 183 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 184 | 185 | jmespath@^0.15.0: 186 | version "0.15.0" 187 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 188 | integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= 189 | 190 | jsonwebtoken@^8.1.1: 191 | version "8.1.1" 192 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.1.1.tgz#b04d8bb2ad847bc93238c3c92170ffdbdd1cb2ea" 193 | dependencies: 194 | jws "^3.1.4" 195 | lodash.includes "^4.3.0" 196 | lodash.isboolean "^3.0.3" 197 | lodash.isinteger "^4.0.4" 198 | lodash.isnumber "^3.0.3" 199 | lodash.isplainobject "^4.0.6" 200 | lodash.isstring "^4.0.1" 201 | lodash.once "^4.0.0" 202 | ms "^2.1.1" 203 | xtend "^4.0.1" 204 | 205 | jwa@^1.1.4: 206 | version "1.1.5" 207 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" 208 | dependencies: 209 | base64url "2.0.0" 210 | buffer-equal-constant-time "1.0.1" 211 | ecdsa-sig-formatter "1.0.9" 212 | safe-buffer "^5.0.1" 213 | 214 | jws@^3.1.4: 215 | version "3.1.4" 216 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" 217 | dependencies: 218 | base64url "^2.0.0" 219 | jwa "^1.1.4" 220 | safe-buffer "^5.0.1" 221 | 222 | lodash.escape@^4.0.1: 223 | version "4.0.1" 224 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" 225 | 226 | lodash.includes@^4.3.0: 227 | version "4.3.0" 228 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 229 | 230 | lodash.isboolean@^3.0.3: 231 | version "3.0.3" 232 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 233 | 234 | lodash.isinteger@^4.0.4: 235 | version "4.0.4" 236 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 237 | 238 | lodash.isnumber@^3.0.3: 239 | version "3.0.3" 240 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 241 | 242 | lodash.isplainobject@^4.0.6: 243 | version "4.0.6" 244 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 245 | 246 | lodash.isstring@^4.0.1: 247 | version "4.0.1" 248 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 249 | 250 | lodash.once@^4.0.0: 251 | version "4.1.1" 252 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 253 | 254 | minimatch@^3.0.4: 255 | version "3.0.4" 256 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 257 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 258 | dependencies: 259 | brace-expansion "^1.1.7" 260 | 261 | ms@^2.1.1: 262 | version "2.1.1" 263 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 264 | 265 | object-inspect@^1.7.0: 266 | version "1.7.0" 267 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 268 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 269 | 270 | object-keys@^1.0.12, object-keys@^1.1.1: 271 | version "1.1.1" 272 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 273 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 274 | 275 | object.getownpropertydescriptors@^2.0.3: 276 | version "2.0.3" 277 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" 278 | integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= 279 | dependencies: 280 | define-properties "^1.1.2" 281 | es-abstract "^1.5.1" 282 | 283 | once@^1.3.0: 284 | version "1.4.0" 285 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 286 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 287 | dependencies: 288 | wrappy "1" 289 | 290 | path-is-absolute@^1.0.0: 291 | version "1.0.1" 292 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 293 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 294 | 295 | punycode@1.3.2: 296 | version "1.3.2" 297 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 298 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 299 | 300 | querystring@0.2.0, querystring@^0.2.0: 301 | version "0.2.0" 302 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 303 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 304 | 305 | rimraf@^3.0.0: 306 | version "3.0.0" 307 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" 308 | integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== 309 | dependencies: 310 | glob "^7.1.3" 311 | 312 | safe-buffer@^5.0.1: 313 | version "5.1.1" 314 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 315 | 316 | sax@>=0.6.0, sax@^1.2.1: 317 | version "1.2.4" 318 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 319 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 320 | 321 | string.prototype.trimleft@^2.1.0: 322 | version "2.1.0" 323 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" 324 | integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== 325 | dependencies: 326 | define-properties "^1.1.3" 327 | function-bind "^1.1.1" 328 | 329 | string.prototype.trimright@^2.1.0: 330 | version "2.1.0" 331 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" 332 | integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== 333 | dependencies: 334 | define-properties "^1.1.3" 335 | function-bind "^1.1.1" 336 | 337 | url@^0.10.3: 338 | version "0.10.3" 339 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 340 | integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= 341 | dependencies: 342 | punycode "1.3.2" 343 | querystring "0.2.0" 344 | 345 | util.promisify@~1.0.0: 346 | version "1.0.0" 347 | resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" 348 | integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== 349 | dependencies: 350 | define-properties "^1.1.2" 351 | object.getownpropertydescriptors "^2.0.3" 352 | 353 | uuid@^3.3.2: 354 | version "3.3.3" 355 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 356 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 357 | 358 | wrappy@1: 359 | version "1.0.2" 360 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 361 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 362 | 363 | xml2js@^0.4.19: 364 | version "0.4.22" 365 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" 366 | integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== 367 | dependencies: 368 | sax ">=0.6.0" 369 | util.promisify "~1.0.0" 370 | xmlbuilder "~11.0.0" 371 | 372 | xmlbuilder@~11.0.0: 373 | version "11.0.1" 374 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 375 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 376 | 377 | xtend@^4.0.1: 378 | version "4.0.1" 379 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 380 | --------------------------------------------------------------------------------