@beiguancyc/parse-server 9.9.0-ruixiang.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +176 -0
- package/NOTICE +10 -0
- package/README.md +1311 -0
- package/bin/parse-live-query-server +3 -0
- package/bin/parse-server +3 -0
- package/lib/AccountLockout.js +149 -0
- package/lib/Adapters/AdapterLoader.js +60 -0
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
- package/lib/Adapters/Auth/AuthAdapter.js +132 -0
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
- package/lib/Adapters/Auth/OAuth1Client.js +204 -0
- package/lib/Adapters/Auth/apple.js +125 -0
- package/lib/Adapters/Auth/facebook.js +187 -0
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +125 -0
- package/lib/Adapters/Auth/google.js +122 -0
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +41 -0
- package/lib/Adapters/Auth/index.js +248 -0
- package/lib/Adapters/Auth/instagram.js +118 -0
- package/lib/Adapters/Auth/janraincapture.js +85 -0
- package/lib/Adapters/Auth/janrainengage.js +57 -0
- package/lib/Adapters/Auth/keycloak.js +168 -0
- package/lib/Adapters/Auth/ldap.js +193 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +117 -0
- package/lib/Adapters/Auth/meetup.js +44 -0
- package/lib/Adapters/Auth/mfa.js +334 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +115 -0
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +113 -0
- package/lib/Adapters/Auth/spotify.js +115 -0
- package/lib/Adapters/Auth/twitter.js +197 -0
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +55 -0
- package/lib/Adapters/Auth/wechat.js +110 -0
- package/lib/Adapters/Auth/weibo.js +141 -0
- package/lib/Adapters/Cache/CacheAdapter.js +40 -0
- package/lib/Adapters/Cache/InMemoryCache.js +61 -0
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
- package/lib/Adapters/Cache/LRUCache.js +35 -0
- package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
- package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +32 -0
- package/lib/Adapters/Files/FilesAdapter.js +129 -0
- package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
- package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
- package/lib/Adapters/Logger/WinstonLogger.js +107 -0
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
- package/lib/Adapters/Push/PushAdapter.js +40 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
- package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
- package/lib/Adapters/Storage/StorageAdapter.js +2 -0
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +687 -0
- package/lib/AuthDataLock.js +53 -0
- package/lib/ClientSDK.js +39 -0
- package/lib/Config.js +879 -0
- package/lib/Controllers/AdaptableController.js +72 -0
- package/lib/Controllers/AnalyticsController.js +43 -0
- package/lib/Controllers/CacheController.js +71 -0
- package/lib/Controllers/DatabaseController.js +1685 -0
- package/lib/Controllers/FilesController.js +122 -0
- package/lib/Controllers/HooksController.js +254 -0
- package/lib/Controllers/LiveQueryController.js +72 -0
- package/lib/Controllers/LoggerController.js +222 -0
- package/lib/Controllers/ParseGraphQLController.js +294 -0
- package/lib/Controllers/PushController.js +224 -0
- package/lib/Controllers/SchemaController.js +1563 -0
- package/lib/Controllers/UserController.js +364 -0
- package/lib/Controllers/index.js +251 -0
- package/lib/Controllers/types.js +2 -0
- package/lib/Deprecator/Deprecations.js +100 -0
- package/lib/Deprecator/Deprecator.js +140 -0
- package/lib/Error.js +50 -0
- package/lib/FileUrlValidator.js +69 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +241 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/helpers/queryComplexity.js +138 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +77 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +161 -0
- package/lib/GraphQL/loaders/schemaQueries.js +80 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +71 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +280 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/InstallationDedup.js +178 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +90 -0
- package/lib/LiveQuery/Id.js +20 -0
- package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
- package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
- package/lib/LiveQuery/ParsePubSub.js +37 -0
- package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
- package/lib/LiveQuery/QueryTools.js +443 -0
- package/lib/LiveQuery/RequestSchema.js +161 -0
- package/lib/LiveQuery/SessionTokenCache.js +51 -0
- package/lib/LiveQuery/Subscription.js +47 -0
- package/lib/LiveQuery/equalObjects.js +50 -0
- package/lib/Options/Definitions.js +1599 -0
- package/lib/Options/docs.js +389 -0
- package/lib/Options/index.js +12 -0
- package/lib/Options/parsers.js +89 -0
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +24 -0
- package/lib/ParseServer.js +632 -0
- package/lib/ParseServerRESTController.js +173 -0
- package/lib/PromiseRouter.js +208 -0
- package/lib/Push/PushQueue.js +67 -0
- package/lib/Push/PushWorker.js +101 -0
- package/lib/Push/utils.js +129 -0
- package/lib/RestQuery.js +1208 -0
- package/lib/RestWrite.js +1671 -0
- package/lib/Routers/AggregateRouter.js +150 -0
- package/lib/Routers/AnalyticsRouter.js +26 -0
- package/lib/Routers/AudiencesRouter.js +54 -0
- package/lib/Routers/ClassesRouter.js +191 -0
- package/lib/Routers/CloudCodeRouter.js +87 -0
- package/lib/Routers/FeaturesRouter.js +72 -0
- package/lib/Routers/FilesRouter.js +772 -0
- package/lib/Routers/FunctionsRouter.js +341 -0
- package/lib/Routers/GlobalConfigRouter.js +123 -0
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +121 -0
- package/lib/Routers/IAPValidationRouter.js +113 -0
- package/lib/Routers/InstallationsRouter.js +46 -0
- package/lib/Routers/LogsRouter.js +57 -0
- package/lib/Routers/PagesRouter.js +676 -0
- package/lib/Routers/PurgeRouter.js +45 -0
- package/lib/Routers/PushRouter.js +75 -0
- package/lib/Routers/RolesRouter.js +33 -0
- package/lib/Routers/SchemasRouter.js +118 -0
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +126 -0
- package/lib/Routers/UsersRouter.js +733 -0
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +34 -0
- package/lib/StatusHandler.js +329 -0
- package/lib/TestUtils.js +87 -0
- package/lib/Utils.js +577 -0
- package/lib/batch.js +185 -0
- package/lib/cache.js +12 -0
- package/lib/cli/definitions/parse-live-query-server.js +9 -0
- package/lib/cli/definitions/parse-server.js +9 -0
- package/lib/cli/parse-live-query-server.js +14 -0
- package/lib/cli/parse-server.js +101 -0
- package/lib/cli/utils/commander.js +132 -0
- package/lib/cli/utils/runner.js +53 -0
- package/lib/cloud-code/Parse.Cloud.js +797 -0
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +54 -0
- package/lib/defaults.js +58 -0
- package/lib/deprecated.js +12 -0
- package/lib/index.js +89 -0
- package/lib/logger.js +40 -0
- package/lib/middlewares.js +810 -0
- package/lib/password.js +40 -0
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +11 -0
- package/lib/rest.js +264 -0
- package/lib/triggers.js +949 -0
- package/lib/vendor/README.md +8 -0
- package/lib/vendor/mongodbUrl.js +1012 -0
- package/package.json +172 -0
- package/postinstall.js +38 -0
- package/public/custom_json.html +17 -0
- package/public/custom_json.json +23 -0
- package/public/custom_page.html +15 -0
- package/public/de/email_verification_link_expired.html +24 -0
- package/public/de/email_verification_link_invalid.html +21 -0
- package/public/de/email_verification_send_fail.html +21 -0
- package/public/de/email_verification_send_success.html +19 -0
- package/public/de/email_verification_success.html +18 -0
- package/public/de/password_reset.html +65 -0
- package/public/de/password_reset_link_invalid.html +19 -0
- package/public/de/password_reset_success.html +18 -0
- package/public/de-AT/email_verification_link_expired.html +24 -0
- package/public/de-AT/email_verification_link_invalid.html +21 -0
- package/public/de-AT/email_verification_send_fail.html +21 -0
- package/public/de-AT/email_verification_send_success.html +19 -0
- package/public/de-AT/email_verification_success.html +18 -0
- package/public/de-AT/password_reset.html +65 -0
- package/public/de-AT/password_reset_link_invalid.html +19 -0
- package/public/de-AT/password_reset_success.html +18 -0
- package/public/email_verification_link_expired.html +24 -0
- package/public/email_verification_link_invalid.html +21 -0
- package/public/email_verification_send_fail.html +21 -0
- package/public/email_verification_send_success.html +19 -0
- package/public/email_verification_success.html +18 -0
- package/public/password_reset.html +65 -0
- package/public/password_reset_link_invalid.html +19 -0
- package/public/password_reset_success.html +18 -0
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +320 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/views/choose_password +215 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseCodeAuthAdapter = _interopRequireDefault(require("./BaseCodeAuthAdapter"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
/**
|
|
10
|
+
* Parse Server authentication adapter for Google Play Games Services.
|
|
11
|
+
*
|
|
12
|
+
* @class GooglePlayGamesServicesAdapter
|
|
13
|
+
* @param {Object} options - The adapter configuration options.
|
|
14
|
+
* @param {string} options.clientId - Your Google Play Games Services App Client ID. Required for secure authentication.
|
|
15
|
+
* @param {string} options.clientSecret - Your Google Play Games Services App Client Secret. Required for secure authentication.
|
|
16
|
+
* @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* ## Parse Server Configuration
|
|
20
|
+
* To configure Parse Server for Google Play Games Services authentication, use the following structure:
|
|
21
|
+
* ```json
|
|
22
|
+
* {
|
|
23
|
+
* "auth": {
|
|
24
|
+
* "gpgames": {
|
|
25
|
+
* "clientId": "your-client-id",
|
|
26
|
+
* "clientSecret": "your-client-secret"
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
* ### Insecure Configuration (Not Recommended)
|
|
32
|
+
* ```json
|
|
33
|
+
* {
|
|
34
|
+
* "auth": {
|
|
35
|
+
* "gpgames": {
|
|
36
|
+
* "enableInsecureAuth": true
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* The adapter requires the following `authData` fields:
|
|
43
|
+
* - **Secure Authentication**: `code`, `redirect_uri`.
|
|
44
|
+
* - **Insecure Authentication (Not Recommended)**: `id`, `access_token`.
|
|
45
|
+
*
|
|
46
|
+
* ## Auth Payloads
|
|
47
|
+
* ### Secure Authentication Payload
|
|
48
|
+
* ```json
|
|
49
|
+
* {
|
|
50
|
+
* "gpgames": {
|
|
51
|
+
* "code": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
|
|
52
|
+
* "redirect_uri": "https://example.com/callback"
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* ### Insecure Authentication Payload (Not Recommended)
|
|
58
|
+
* ```json
|
|
59
|
+
* {
|
|
60
|
+
* "gpgames": {
|
|
61
|
+
* "id": "123456789",
|
|
62
|
+
* "access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
63
|
+
* }
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* ## Notes
|
|
68
|
+
* - `enableInsecureAuth` is **not recommended** and may be removed in future versions. Use secure authentication with `code` and `redirect_uri`.
|
|
69
|
+
* - Secure authentication exchanges the `code` provided by the client for an access token using Google Play Games Services' OAuth API.
|
|
70
|
+
*
|
|
71
|
+
* @see {@link https://developers.google.com/games/services/console/enabling Google Play Games Services Authentication Documentation}
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
class GooglePlayGamesServicesAdapter extends _BaseCodeAuthAdapter.default {
|
|
75
|
+
constructor() {
|
|
76
|
+
super("gpgames");
|
|
77
|
+
}
|
|
78
|
+
async getAccessTokenFromCode(authData) {
|
|
79
|
+
const tokenUrl = 'https://oauth2.googleapis.com/token';
|
|
80
|
+
const response = await fetch(tokenUrl, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers: {
|
|
83
|
+
'Content-Type': 'application/json',
|
|
84
|
+
Accept: 'application/json'
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({
|
|
87
|
+
client_id: this.clientId,
|
|
88
|
+
client_secret: this.clientSecret,
|
|
89
|
+
code: authData.code,
|
|
90
|
+
redirect_uri: authData.redirectUri,
|
|
91
|
+
grant_type: 'authorization_code'
|
|
92
|
+
})
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `Failed to exchange code for token: ${response.statusText}`);
|
|
96
|
+
}
|
|
97
|
+
const data = await response.json();
|
|
98
|
+
if (data.error) {
|
|
99
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, data.error_description || data.error);
|
|
100
|
+
}
|
|
101
|
+
return data.access_token;
|
|
102
|
+
}
|
|
103
|
+
async getUserFromAccessToken(accessToken, authData) {
|
|
104
|
+
const userApiUrl = `https://www.googleapis.com/games/v1/players/${authData.id}`;
|
|
105
|
+
const response = await fetch(userApiUrl, {
|
|
106
|
+
method: 'GET',
|
|
107
|
+
headers: {
|
|
108
|
+
Authorization: `Bearer ${accessToken}`,
|
|
109
|
+
Accept: 'application/json'
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `Failed to fetch Google Play Games Services user: ${response.statusText}`);
|
|
114
|
+
}
|
|
115
|
+
const userData = await response.json();
|
|
116
|
+
if (!userData.playerId || userData.playerId !== authData.id) {
|
|
117
|
+
throw new Parse.Error(Parse.Error.VALIDATION_ERROR, 'Invalid Google Play Games Services user data received.');
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
id: userData.playerId
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
var _default = exports.default = new GooglePlayGamesServicesAdapter();
|
|
125
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiR29vZ2xlUGxheUdhbWVzU2VydmljZXNBZGFwdGVyIiwiQmFzZUNvZGVBdXRoQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZSIsImF1dGhEYXRhIiwidG9rZW5VcmwiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsIkFjY2VwdCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiY2xpZW50X2lkIiwiY2xpZW50SWQiLCJjbGllbnRfc2VjcmV0IiwiY2xpZW50U2VjcmV0IiwiY29kZSIsInJlZGlyZWN0X3VyaSIsInJlZGlyZWN0VXJpIiwiZ3JhbnRfdHlwZSIsIm9rIiwiUGFyc2UiLCJFcnJvciIsIlZBTElEQVRJT05fRVJST1IiLCJzdGF0dXNUZXh0IiwiZGF0YSIsImpzb24iLCJlcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJlcnJvcl9kZXNjcmlwdGlvbiIsImFjY2Vzc190b2tlbiIsImdldFVzZXJGcm9tQWNjZXNzVG9rZW4iLCJhY2Nlc3NUb2tlbiIsInVzZXJBcGlVcmwiLCJpZCIsIkF1dGhvcml6YXRpb24iLCJ1c2VyRGF0YSIsInBsYXllcklkIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvZ3BnYW1lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlIFNlcnZlciBhdXRoZW50aWNhdGlvbiBhZGFwdGVyIGZvciBHb29nbGUgUGxheSBHYW1lcyBTZXJ2aWNlcy5cbiAqXG4gKiBAY2xhc3MgR29vZ2xlUGxheUdhbWVzU2VydmljZXNBZGFwdGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNsaWVudElkIC0gWW91ciBHb29nbGUgUGxheSBHYW1lcyBTZXJ2aWNlcyBBcHAgQ2xpZW50IElELiBSZXF1aXJlZCBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY2xpZW50U2VjcmV0IC0gWW91ciBHb29nbGUgUGxheSBHYW1lcyBTZXJ2aWNlcyBBcHAgQ2xpZW50IFNlY3JldC4gUmVxdWlyZWQgZm9yIHNlY3VyZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5hYmxlSW5zZWN1cmVBdXRoPWZhbHNlXSAtICoqW0RFUFJFQ0FURURdKiogRW5hYmxlIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uIChub3QgcmVjb21tZW5kZWQpLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogIyMgUGFyc2UgU2VydmVyIENvbmZpZ3VyYXRpb25cbiAqIFRvIGNvbmZpZ3VyZSBQYXJzZSBTZXJ2ZXIgZm9yIEdvb2dsZSBQbGF5IEdhbWVzIFNlcnZpY2VzIGF1dGhlbnRpY2F0aW9uLCB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJncGdhbWVzXCI6IHtcbiAqICAgICAgIFwiY2xpZW50SWRcIjogXCJ5b3VyLWNsaWVudC1pZFwiLFxuICogICAgICAgXCJjbGllbnRTZWNyZXRcIjogXCJ5b3VyLWNsaWVudC1zZWNyZXRcIlxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiAjIyMgSW5zZWN1cmUgQ29uZmlndXJhdGlvbiAoTm90IFJlY29tbWVuZGVkKVxuICogYGBganNvblxuICoge1xuICogICBcImF1dGhcIjoge1xuICogICAgIFwiZ3BnYW1lc1wiOiB7XG4gKiAgICAgICBcImVuYWJsZUluc2VjdXJlQXV0aFwiOiB0cnVlXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgYWRhcHRlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGBhdXRoRGF0YWAgZmllbGRzOlxuICogLSAqKlNlY3VyZSBBdXRoZW50aWNhdGlvbioqOiBgY29kZWAsIGByZWRpcmVjdF91cmlgLlxuICogLSAqKkluc2VjdXJlIEF1dGhlbnRpY2F0aW9uIChOb3QgUmVjb21tZW5kZWQpKio6IGBpZGAsIGBhY2Nlc3NfdG9rZW5gLlxuICpcbiAqICMjIEF1dGggUGF5bG9hZHNcbiAqICMjIyBTZWN1cmUgQXV0aGVudGljYXRpb24gUGF5bG9hZFxuICogYGBganNvblxuICoge1xuICogICBcImdwZ2FtZXNcIjoge1xuICogICAgIFwiY29kZVwiOiBcInh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhcIixcbiAqICAgICBcInJlZGlyZWN0X3VyaVwiOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2FsbGJhY2tcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgSW5zZWN1cmUgQXV0aGVudGljYXRpb24gUGF5bG9hZCAoTm90IFJlY29tbWVuZGVkKVxuICogYGBganNvblxuICoge1xuICogICBcImdwZ2FtZXNcIjoge1xuICogICAgIFwiaWRcIjogXCIxMjM0NTY3ODlcIixcbiAqICAgICBcImFjY2Vzc190b2tlblwiOiBcInh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBOb3Rlc1xuICogLSBgZW5hYmxlSW5zZWN1cmVBdXRoYCBpcyAqKm5vdCByZWNvbW1lbmRlZCoqIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFVzZSBzZWN1cmUgYXV0aGVudGljYXRpb24gd2l0aCBgY29kZWAgYW5kIGByZWRpcmVjdF91cmlgLlxuICogLSBTZWN1cmUgYXV0aGVudGljYXRpb24gZXhjaGFuZ2VzIHRoZSBgY29kZWAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIEdvb2dsZSBQbGF5IEdhbWVzIFNlcnZpY2VzJyBPQXV0aCBBUEkuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FtZXMvc2VydmljZXMvY29uc29sZS9lbmFibGluZyBHb29nbGUgUGxheSBHYW1lcyBTZXJ2aWNlcyBBdXRoZW50aWNhdGlvbiBEb2N1bWVudGF0aW9ufVxuICovXG5cbmltcG9ydCBCYXNlQ29kZUF1dGhBZGFwdGVyIGZyb20gJy4vQmFzZUNvZGVBdXRoQWRhcHRlcic7XG5jbGFzcyBHb29nbGVQbGF5R2FtZXNTZXJ2aWNlc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQ29kZUF1dGhBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJncGdhbWVzXCIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZShhdXRoRGF0YSkge1xuICAgIGNvbnN0IHRva2VuVXJsID0gJ2h0dHBzOi8vb2F1dGgyLmdvb2dsZWFwaXMuY29tL3Rva2VuJztcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRva2VuVXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuY2xpZW50U2VjcmV0LFxuICAgICAgICBjb2RlOiBhdXRoRGF0YS5jb2RlLFxuICAgICAgICByZWRpcmVjdF91cmk6IGF1dGhEYXRhLnJlZGlyZWN0VXJpLFxuICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICBgRmFpbGVkIHRvIGV4Y2hhbmdlIGNvZGUgZm9yIHRva2VuOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAgIGRhdGEuZXJyb3JfZGVzY3JpcHRpb24gfHwgZGF0YS5lcnJvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YS5hY2Nlc3NfdG9rZW47XG4gIH1cblxuICBhc3luYyBnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuLCBhdXRoRGF0YSkge1xuICAgIGNvbnN0IHVzZXJBcGlVcmwgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZ2FtZXMvdjEvcGxheWVycy8ke2F1dGhEYXRhLmlkfWA7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1c2VyQXBpVXJsLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIEdvb2dsZSBQbGF5IEdhbWVzIFNlcnZpY2VzIHVzZXI6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghdXNlckRhdGEucGxheWVySWQgfHwgdXNlckRhdGEucGxheWVySWQgIT09IGF1dGhEYXRhLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICdJbnZhbGlkIEdvb2dsZSBQbGF5IEdhbWVzIFNlcnZpY2VzIHVzZXIgZGF0YSByZWNlaXZlZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdXNlckRhdGEucGxheWVySWRcbiAgICB9O1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEdvb2dsZVBsYXlHYW1lc1NlcnZpY2VzQWRhcHRlcigpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpRUEsSUFBQUEsb0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3RCxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQWpFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const https = require('https');
|
|
4
|
+
function makeCallback(resolve, reject, noJSON) {
|
|
5
|
+
return function (res) {
|
|
6
|
+
let data = '';
|
|
7
|
+
res.on('data', chunk => {
|
|
8
|
+
data += chunk;
|
|
9
|
+
});
|
|
10
|
+
res.on('end', () => {
|
|
11
|
+
if (noJSON) {
|
|
12
|
+
return resolve(data);
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
data = JSON.parse(data);
|
|
16
|
+
} catch (e) {
|
|
17
|
+
return reject(e);
|
|
18
|
+
}
|
|
19
|
+
resolve(data);
|
|
20
|
+
});
|
|
21
|
+
res.on('error', reject);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function get(options, noJSON = false) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
https.get(options, makeCallback(resolve, reject, noJSON)).on('error', reject);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function request(options, postData) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const req = https.request(options, makeCallback(resolve, reject));
|
|
32
|
+
req.on('error', reject);
|
|
33
|
+
req.write(postData);
|
|
34
|
+
req.end();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
module.exports = {
|
|
38
|
+
get,
|
|
39
|
+
request
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwcyIsInJlcXVpcmUiLCJtYWtlQ2FsbGJhY2siLCJyZXNvbHZlIiwicmVqZWN0Iiwibm9KU09OIiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJKU09OIiwicGFyc2UiLCJlIiwiZ2V0Iiwib3B0aW9ucyIsIlByb21pc2UiLCJyZXF1ZXN0IiwicG9zdERhdGEiLCJyZXEiLCJ3cml0ZSIsImVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9odHRwc1JlcXVlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5mdW5jdGlvbiBtYWtlQ2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0LCBub0pTT04pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICBsZXQgZGF0YSA9ICcnO1xuICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgfSk7XG4gICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBpZiAobm9KU09OKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGRhdGEpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGRhdGEpO1xuICAgIH0pO1xuICAgIHJlcy5vbignZXJyb3InLCByZWplY3QpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXQob3B0aW9ucywgbm9KU09OID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwcy5nZXQob3B0aW9ucywgbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCwgbm9KU09OKSkub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3Qob3B0aW9ucywgcG9zdERhdGEpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXEgPSBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICByZXEud3JpdGUocG9zdERhdGEpO1xuICAgIHJlcS5lbmQoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBnZXQsIHJlcXVlc3QgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFFOUIsU0FBU0MsWUFBWUEsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sRUFBRTtFQUM3QyxPQUFPLFVBQVVDLEdBQUcsRUFBRTtJQUNwQixJQUFJQyxJQUFJLEdBQUcsRUFBRTtJQUNiRCxHQUFHLENBQUNFLEVBQUUsQ0FBQyxNQUFNLEVBQUVDLEtBQUssSUFBSTtNQUN0QkYsSUFBSSxJQUFJRSxLQUFLO0lBQ2YsQ0FBQyxDQUFDO0lBQ0ZILEdBQUcsQ0FBQ0UsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNO01BQ2xCLElBQUlILE1BQU0sRUFBRTtRQUNWLE9BQU9GLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDO01BQ3RCO01BQ0EsSUFBSTtRQUNGQSxJQUFJLEdBQUdHLElBQUksQ0FBQ0MsS0FBSyxDQUFDSixJQUFJLENBQUM7TUFDekIsQ0FBQyxDQUFDLE9BQU9LLENBQUMsRUFBRTtRQUNWLE9BQU9SLE1BQU0sQ0FBQ1EsQ0FBQyxDQUFDO01BQ2xCO01BQ0FULE9BQU8sQ0FBQ0ksSUFBSSxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0ZELEdBQUcsQ0FBQ0UsRUFBRSxDQUFDLE9BQU8sRUFBRUosTUFBTSxDQUFDO0VBQ3pCLENBQUM7QUFDSDtBQUVBLFNBQVNTLEdBQUdBLENBQUNDLE9BQU8sRUFBRVQsTUFBTSxHQUFHLEtBQUssRUFBRTtFQUNwQyxPQUFPLElBQUlVLE9BQU8sQ0FBQyxDQUFDWixPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUN0Q0osS0FBSyxDQUFDYSxHQUFHLENBQUNDLE9BQU8sRUFBRVosWUFBWSxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxDQUFDLENBQUMsQ0FBQ0csRUFBRSxDQUFDLE9BQU8sRUFBRUosTUFBTSxDQUFDO0VBQy9FLENBQUMsQ0FBQztBQUNKO0FBRUEsU0FBU1ksT0FBT0EsQ0FBQ0YsT0FBTyxFQUFFRyxRQUFRLEVBQUU7RUFDbEMsT0FBTyxJQUFJRixPQUFPLENBQUMsQ0FBQ1osT0FBTyxFQUFFQyxNQUFNLEtBQUs7SUFDdEMsTUFBTWMsR0FBRyxHQUFHbEIsS0FBSyxDQUFDZ0IsT0FBTyxDQUFDRixPQUFPLEVBQUVaLFlBQVksQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLENBQUMsQ0FBQztJQUNqRWMsR0FBRyxDQUFDVixFQUFFLENBQUMsT0FBTyxFQUFFSixNQUFNLENBQUM7SUFDdkJjLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixRQUFRLENBQUM7SUFDbkJDLEdBQUcsQ0FBQ0UsR0FBRyxDQUFDLENBQUM7RUFDWCxDQUFDLENBQUM7QUFDSjtBQUVBQyxNQUFNLENBQUNDLE9BQU8sR0FBRztFQUFFVCxHQUFHO0VBQUVHO0FBQVEsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _AdapterLoader = _interopRequireDefault(require("../AdapterLoader"));
|
|
4
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
5
|
+
var _AuthAdapter = _interopRequireDefault(require("./AuthAdapter"));
|
|
6
|
+
var _gcenter = _interopRequireDefault(require("./gcenter"));
|
|
7
|
+
var _github = _interopRequireDefault(require("./github"));
|
|
8
|
+
var _gpgames = _interopRequireDefault(require("./gpgames"));
|
|
9
|
+
var _instagram = _interopRequireDefault(require("./instagram"));
|
|
10
|
+
var _line = _interopRequireDefault(require("./line"));
|
|
11
|
+
var _linkedin = _interopRequireDefault(require("./linkedin"));
|
|
12
|
+
var _mfa = _interopRequireDefault(require("./mfa"));
|
|
13
|
+
var _microsoft = _interopRequireDefault(require("./microsoft"));
|
|
14
|
+
var _oauth = _interopRequireDefault(require("./oauth2"));
|
|
15
|
+
var _qq = _interopRequireDefault(require("./qq"));
|
|
16
|
+
var _spotify = _interopRequireDefault(require("./spotify"));
|
|
17
|
+
var _twitter = _interopRequireDefault(require("./twitter"));
|
|
18
|
+
var _wechat = _interopRequireDefault(require("./wechat"));
|
|
19
|
+
var _weibo = _interopRequireDefault(require("./weibo"));
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
+
const apple = require('./apple');
|
|
22
|
+
const digits = require('./twitter'); // digits tokens are validated by twitter
|
|
23
|
+
const facebook = require('./facebook');
|
|
24
|
+
const google = require('./google');
|
|
25
|
+
const janraincapture = require('./janraincapture');
|
|
26
|
+
const janrainengage = require('./janrainengage');
|
|
27
|
+
const keycloak = require('./keycloak');
|
|
28
|
+
const ldap = require('./ldap');
|
|
29
|
+
const meetup = require('./meetup');
|
|
30
|
+
const phantauth = require('./phantauth');
|
|
31
|
+
const vkontakte = require('./vkontakte');
|
|
32
|
+
const anonymous = {
|
|
33
|
+
validateAuthData: () => {
|
|
34
|
+
return Promise.resolve();
|
|
35
|
+
},
|
|
36
|
+
validateAppId: () => {
|
|
37
|
+
return Promise.resolve();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const providers = {
|
|
41
|
+
apple,
|
|
42
|
+
gcenter: _gcenter.default,
|
|
43
|
+
gpgames: _gpgames.default,
|
|
44
|
+
facebook,
|
|
45
|
+
instagram: _instagram.default,
|
|
46
|
+
linkedin: _linkedin.default,
|
|
47
|
+
meetup,
|
|
48
|
+
mfa: _mfa.default,
|
|
49
|
+
google,
|
|
50
|
+
github: _github.default,
|
|
51
|
+
twitter: _twitter.default,
|
|
52
|
+
spotify: _spotify.default,
|
|
53
|
+
anonymous,
|
|
54
|
+
digits,
|
|
55
|
+
janrainengage,
|
|
56
|
+
janraincapture,
|
|
57
|
+
line: _line.default,
|
|
58
|
+
vkontakte,
|
|
59
|
+
qq: _qq.default,
|
|
60
|
+
wechat: _wechat.default,
|
|
61
|
+
weibo: _weibo.default,
|
|
62
|
+
phantauth,
|
|
63
|
+
microsoft: _microsoft.default,
|
|
64
|
+
keycloak,
|
|
65
|
+
ldap
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Indexed auth policies
|
|
69
|
+
const authAdapterPolicies = {
|
|
70
|
+
default: true,
|
|
71
|
+
solo: true,
|
|
72
|
+
additional: true
|
|
73
|
+
};
|
|
74
|
+
function authDataValidator(provider, adapter, appIds, options) {
|
|
75
|
+
return async function (authData, req, user, requestObject) {
|
|
76
|
+
if (appIds && typeof adapter.validateAppId === 'function') {
|
|
77
|
+
await Promise.resolve(adapter.validateAppId(appIds, authData, options, requestObject));
|
|
78
|
+
}
|
|
79
|
+
if (adapter.policy && !authAdapterPolicies[adapter.policy] && typeof adapter.policy !== 'function') {
|
|
80
|
+
throw new _node.default.Error(_node.default.Error.OTHER_CAUSE, 'AuthAdapter policy is not configured correctly. The value must be either "solo", "additional", "default" or undefined (will be handled as "default")');
|
|
81
|
+
}
|
|
82
|
+
if (typeof adapter.validateAuthData === 'function') {
|
|
83
|
+
return adapter.validateAuthData(authData, options, requestObject);
|
|
84
|
+
}
|
|
85
|
+
if (typeof adapter.validateSetUp !== 'function' || typeof adapter.validateLogin !== 'function' || typeof adapter.validateUpdate !== 'function') {
|
|
86
|
+
throw new _node.default.Error(_node.default.Error.OTHER_CAUSE, 'Adapter is not configured. Implement either validateAuthData or all of the following: validateSetUp, validateLogin and validateUpdate');
|
|
87
|
+
}
|
|
88
|
+
// When masterKey is detected, we should trigger a logged in user
|
|
89
|
+
const isLoggedIn = req.auth.user && user && req.auth.user.id === user.id || user && req.auth.isMaster;
|
|
90
|
+
let hasAuthDataConfigured = false;
|
|
91
|
+
if (user && user.get('authData') && user.get('authData')[provider]) {
|
|
92
|
+
hasAuthDataConfigured = true;
|
|
93
|
+
}
|
|
94
|
+
if (isLoggedIn) {
|
|
95
|
+
// User is updating their authData
|
|
96
|
+
if (hasAuthDataConfigured) {
|
|
97
|
+
return {
|
|
98
|
+
method: 'validateUpdate',
|
|
99
|
+
validator: () => adapter.validateUpdate(authData, options, requestObject)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Set up if the user does not have the provider configured
|
|
103
|
+
return {
|
|
104
|
+
method: 'validateSetUp',
|
|
105
|
+
validator: () => adapter.validateSetUp(authData, options, requestObject)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Not logged in and authData is configured on the user
|
|
110
|
+
if (hasAuthDataConfigured) {
|
|
111
|
+
return {
|
|
112
|
+
method: 'validateLogin',
|
|
113
|
+
validator: () => adapter.validateLogin(authData, options, requestObject)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// User not logged in and the provider is not set up, for example when a new user
|
|
118
|
+
// signs up or an existing user uses a new auth provider
|
|
119
|
+
return {
|
|
120
|
+
method: 'validateSetUp',
|
|
121
|
+
validator: () => adapter.validateSetUp(authData, options, requestObject)
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function loadAuthAdapter(provider, authOptions) {
|
|
126
|
+
// providers are auth providers implemented by default
|
|
127
|
+
let defaultAdapter = providers[provider];
|
|
128
|
+
// authOptions can contain complete custom auth adapters or
|
|
129
|
+
// a default auth adapter like Facebook
|
|
130
|
+
const providerOptions = authOptions[provider];
|
|
131
|
+
if (providerOptions && Object.prototype.hasOwnProperty.call(providerOptions, 'oauth2') && providerOptions['oauth2'] === true) {
|
|
132
|
+
defaultAdapter = _oauth.default;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Default provider not found and a custom auth provider was not provided
|
|
136
|
+
if (!defaultAdapter && !providerOptions) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const adapter = defaultAdapter instanceof _AuthAdapter.default ? new defaultAdapter.constructor() : Object.assign({}, defaultAdapter);
|
|
140
|
+
const keys = ['validateAuthData', 'validateAppId', 'validateSetUp', 'validateLogin', 'validateUpdate', 'challenge', 'validateOptions', 'policy', 'afterFind'];
|
|
141
|
+
const defaultAuthAdapter = new _AuthAdapter.default();
|
|
142
|
+
keys.forEach(key => {
|
|
143
|
+
const existing = adapter?.[key];
|
|
144
|
+
if (existing && typeof existing === 'function' && existing.toString() === defaultAuthAdapter[key].toString()) {
|
|
145
|
+
adapter[key] = null;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
const appIds = providerOptions ? providerOptions.appIds : undefined;
|
|
149
|
+
|
|
150
|
+
// Try the configuration methods
|
|
151
|
+
if (providerOptions) {
|
|
152
|
+
const optionalAdapter = (0, _AdapterLoader.default)(providerOptions, undefined, providerOptions);
|
|
153
|
+
if (optionalAdapter) {
|
|
154
|
+
keys.forEach(key => {
|
|
155
|
+
if (optionalAdapter[key]) {
|
|
156
|
+
adapter[key] = optionalAdapter[key];
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (adapter.validateOptions) {
|
|
162
|
+
adapter.validateOptions(providerOptions);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
adapter,
|
|
166
|
+
appIds,
|
|
167
|
+
providerOptions
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
module.exports = function (authOptions = {}, enableAnonymousUsers = true) {
|
|
171
|
+
let _enableAnonymousUsers = enableAnonymousUsers;
|
|
172
|
+
const setEnableAnonymousUsers = function (enable) {
|
|
173
|
+
_enableAnonymousUsers = enable;
|
|
174
|
+
};
|
|
175
|
+
// To handle the test cases on configuration
|
|
176
|
+
const getValidatorForProvider = function (provider) {
|
|
177
|
+
if (provider === 'anonymous' && !_enableAnonymousUsers) {
|
|
178
|
+
return {
|
|
179
|
+
validator: undefined
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const authAdapter = loadAuthAdapter(provider, authOptions);
|
|
183
|
+
if (!authAdapter) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const {
|
|
187
|
+
adapter,
|
|
188
|
+
appIds,
|
|
189
|
+
providerOptions
|
|
190
|
+
} = authAdapter;
|
|
191
|
+
return {
|
|
192
|
+
validator: authDataValidator(provider, adapter, appIds, providerOptions),
|
|
193
|
+
adapter
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
const runAfterFind = async (req, authData) => {
|
|
197
|
+
if (!authData) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const adapters = Object.keys(authData);
|
|
201
|
+
await Promise.all(adapters.map(async provider => {
|
|
202
|
+
const authAdapter = getValidatorForProvider(provider);
|
|
203
|
+
if (!authAdapter) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const {
|
|
207
|
+
adapter,
|
|
208
|
+
providerOptions
|
|
209
|
+
} = authAdapter;
|
|
210
|
+
const afterFind = adapter.afterFind;
|
|
211
|
+
if (afterFind && typeof afterFind === 'function') {
|
|
212
|
+
const requestObject = {
|
|
213
|
+
ip: req.config.ip,
|
|
214
|
+
user: req.auth.user,
|
|
215
|
+
master: req.auth.isMaster
|
|
216
|
+
};
|
|
217
|
+
const result = afterFind.call(adapter, authData[provider], providerOptions, requestObject);
|
|
218
|
+
if (result) {
|
|
219
|
+
authData[provider] = result;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}));
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// Returns the list of auth provider names that have a valid adapter configured.
|
|
226
|
+
// This includes both built-in providers and custom providers from authOptions.
|
|
227
|
+
const getProviders = function () {
|
|
228
|
+
const allProviders = new Set([...Object.keys(providers), ...Object.keys(authOptions)]);
|
|
229
|
+
if (!_enableAnonymousUsers) {
|
|
230
|
+
allProviders.delete('anonymous');
|
|
231
|
+
}
|
|
232
|
+
return [...allProviders].filter(provider => {
|
|
233
|
+
try {
|
|
234
|
+
return !!loadAuthAdapter(provider, authOptions);
|
|
235
|
+
} catch {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
return Object.freeze({
|
|
241
|
+
getValidatorForProvider,
|
|
242
|
+
getProviders,
|
|
243
|
+
setEnableAnonymousUsers,
|
|
244
|
+
runAfterFind
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
module.exports.loadAuthAdapter = loadAuthAdapter;
|
|
248
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQWRhcHRlckxvYWRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX25vZGUiLCJfQXV0aEFkYXB0ZXIiLCJfZ2NlbnRlciIsIl9naXRodWIiLCJfZ3BnYW1lcyIsIl9pbnN0YWdyYW0iLCJfbGluZSIsIl9saW5rZWRpbiIsIl9tZmEiLCJfbWljcm9zb2Z0IiwiX29hdXRoIiwiX3FxIiwiX3Nwb3RpZnkiLCJfdHdpdHRlciIsIl93ZWNoYXQiLCJfd2VpYm8iLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJhcHBsZSIsImRpZ2l0cyIsImZhY2Vib29rIiwiZ29vZ2xlIiwiamFucmFpbmNhcHR1cmUiLCJqYW5yYWluZW5nYWdlIiwia2V5Y2xvYWsiLCJsZGFwIiwibWVldHVwIiwicGhhbnRhdXRoIiwidmtvbnRha3RlIiwiYW5vbnltb3VzIiwidmFsaWRhdGVBdXRoRGF0YSIsIlByb21pc2UiLCJyZXNvbHZlIiwidmFsaWRhdGVBcHBJZCIsInByb3ZpZGVycyIsImdjZW50ZXIiLCJncGdhbWVzIiwiaW5zdGFncmFtIiwibGlua2VkaW4iLCJtZmEiLCJnaXRodWIiLCJ0d2l0dGVyIiwic3BvdGlmeSIsImxpbmUiLCJxcSIsIndlY2hhdCIsIndlaWJvIiwibWljcm9zb2Z0IiwiYXV0aEFkYXB0ZXJQb2xpY2llcyIsInNvbG8iLCJhZGRpdGlvbmFsIiwiYXV0aERhdGFWYWxpZGF0b3IiLCJwcm92aWRlciIsImFkYXB0ZXIiLCJhcHBJZHMiLCJvcHRpb25zIiwiYXV0aERhdGEiLCJyZXEiLCJ1c2VyIiwicmVxdWVzdE9iamVjdCIsInBvbGljeSIsIlBhcnNlIiwiRXJyb3IiLCJPVEhFUl9DQVVTRSIsInZhbGlkYXRlU2V0VXAiLCJ2YWxpZGF0ZUxvZ2luIiwidmFsaWRhdGVVcGRhdGUiLCJpc0xvZ2dlZEluIiwiYXV0aCIsImlkIiwiaXNNYXN0ZXIiLCJoYXNBdXRoRGF0YUNvbmZpZ3VyZWQiLCJnZXQiLCJtZXRob2QiLCJ2YWxpZGF0b3IiLCJsb2FkQXV0aEFkYXB0ZXIiLCJhdXRoT3B0aW9ucyIsImRlZmF1bHRBZGFwdGVyIiwicHJvdmlkZXJPcHRpb25zIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwib2F1dGgyIiwiQXV0aEFkYXB0ZXIiLCJjb25zdHJ1Y3RvciIsImFzc2lnbiIsImtleXMiLCJkZWZhdWx0QXV0aEFkYXB0ZXIiLCJmb3JFYWNoIiwia2V5IiwiZXhpc3RpbmciLCJ0b1N0cmluZyIsInVuZGVmaW5lZCIsIm9wdGlvbmFsQWRhcHRlciIsImxvYWRBZGFwdGVyIiwidmFsaWRhdGVPcHRpb25zIiwibW9kdWxlIiwiZXhwb3J0cyIsImVuYWJsZUFub255bW91c1VzZXJzIiwiX2VuYWJsZUFub255bW91c1VzZXJzIiwic2V0RW5hYmxlQW5vbnltb3VzVXNlcnMiLCJlbmFibGUiLCJnZXRWYWxpZGF0b3JGb3JQcm92aWRlciIsImF1dGhBZGFwdGVyIiwicnVuQWZ0ZXJGaW5kIiwiYWRhcHRlcnMiLCJhbGwiLCJtYXAiLCJhZnRlckZpbmQiLCJpcCIsImNvbmZpZyIsIm1hc3RlciIsInJlc3VsdCIsImdldFByb3ZpZGVycyIsImFsbFByb3ZpZGVycyIsIlNldCIsImRlbGV0ZSIsImZpbHRlciIsImZyZWV6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2FkQWRhcHRlciBmcm9tICcuLi9BZGFwdGVyTG9hZGVyJztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCBBdXRoQWRhcHRlciBmcm9tICcuL0F1dGhBZGFwdGVyJztcblxuY29uc3QgYXBwbGUgPSByZXF1aXJlKCcuL2FwcGxlJyk7XG5jb25zdCBkaWdpdHMgPSByZXF1aXJlKCcuL3R3aXR0ZXInKTsgLy8gZGlnaXRzIHRva2VucyBhcmUgdmFsaWRhdGVkIGJ5IHR3aXR0ZXJcbmNvbnN0IGZhY2Vib29rID0gcmVxdWlyZSgnLi9mYWNlYm9vaycpO1xuaW1wb3J0IGdjZW50ZXIgZnJvbSAnLi9nY2VudGVyJztcbmltcG9ydCBnaXRodWIgZnJvbSAnLi9naXRodWInO1xuY29uc3QgZ29vZ2xlID0gcmVxdWlyZSgnLi9nb29nbGUnKTtcbmltcG9ydCBncGdhbWVzIGZyb20gJy4vZ3BnYW1lcyc7XG5pbXBvcnQgaW5zdGFncmFtIGZyb20gJy4vaW5zdGFncmFtJztcbmNvbnN0IGphbnJhaW5jYXB0dXJlID0gcmVxdWlyZSgnLi9qYW5yYWluY2FwdHVyZScpO1xuY29uc3QgamFucmFpbmVuZ2FnZSA9IHJlcXVpcmUoJy4vamFucmFpbmVuZ2FnZScpO1xuY29uc3Qga2V5Y2xvYWsgPSByZXF1aXJlKCcuL2tleWNsb2FrJyk7XG5jb25zdCBsZGFwID0gcmVxdWlyZSgnLi9sZGFwJyk7XG5pbXBvcnQgbGluZSBmcm9tICcuL2xpbmUnO1xuaW1wb3J0IGxpbmtlZGluIGZyb20gJy4vbGlua2VkaW4nO1xuY29uc3QgbWVldHVwID0gcmVxdWlyZSgnLi9tZWV0dXAnKTtcbmltcG9ydCBtZmEgZnJvbSAnLi9tZmEnO1xuaW1wb3J0IG1pY3Jvc29mdCBmcm9tICcuL21pY3Jvc29mdCc7XG5pbXBvcnQgb2F1dGgyIGZyb20gJy4vb2F1dGgyJztcbmNvbnN0IHBoYW50YXV0aCA9IHJlcXVpcmUoJy4vcGhhbnRhdXRoJyk7XG5pbXBvcnQgcXEgZnJvbSAnLi9xcSc7XG5pbXBvcnQgc3BvdGlmeSBmcm9tICcuL3Nwb3RpZnknO1xuaW1wb3J0IHR3aXR0ZXIgZnJvbSAnLi90d2l0dGVyJztcbmNvbnN0IHZrb250YWt0ZSA9IHJlcXVpcmUoJy4vdmtvbnRha3RlJyk7XG5pbXBvcnQgd2VjaGF0IGZyb20gJy4vd2VjaGF0JztcbmltcG9ydCB3ZWlibyBmcm9tICcuL3dlaWJvJztcblxuXG5jb25zdCBhbm9ueW1vdXMgPSB7XG4gIHZhbGlkYXRlQXV0aERhdGE6ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH0sXG4gIHZhbGlkYXRlQXBwSWQ6ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH0sXG59O1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gIGFwcGxlLFxuICBnY2VudGVyLFxuICBncGdhbWVzLFxuICBmYWNlYm9vayxcbiAgaW5zdGFncmFtLFxuICBsaW5rZWRpbixcbiAgbWVldHVwLFxuICBtZmEsXG4gIGdvb2dsZSxcbiAgZ2l0aHViLFxuICB0d2l0dGVyLFxuICBzcG90aWZ5LFxuICBhbm9ueW1vdXMsXG4gIGRpZ2l0cyxcbiAgamFucmFpbmVuZ2FnZSxcbiAgamFucmFpbmNhcHR1cmUsXG4gIGxpbmUsXG4gIHZrb250YWt0ZSxcbiAgcXEsXG4gIHdlY2hhdCxcbiAgd2VpYm8sXG4gIHBoYW50YXV0aCxcbiAgbWljcm9zb2Z0LFxuICBrZXljbG9hayxcbiAgbGRhcCxcbn07XG5cbi8vIEluZGV4ZWQgYXV0aCBwb2xpY2llc1xuY29uc3QgYXV0aEFkYXB0ZXJQb2xpY2llcyA9IHtcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgc29sbzogdHJ1ZSxcbiAgYWRkaXRpb25hbDogdHJ1ZSxcbn07XG5cbmZ1bmN0aW9uIGF1dGhEYXRhVmFsaWRhdG9yKHByb3ZpZGVyLCBhZGFwdGVyLCBhcHBJZHMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChhdXRoRGF0YSwgcmVxLCB1c2VyLCByZXF1ZXN0T2JqZWN0KSB7XG4gICAgaWYgKGFwcElkcyAmJiB0eXBlb2YgYWRhcHRlci52YWxpZGF0ZUFwcElkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoYWRhcHRlci52YWxpZGF0ZUFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgYWRhcHRlci5wb2xpY3kgJiZcbiAgICAgICFhdXRoQWRhcHRlclBvbGljaWVzW2FkYXB0ZXIucG9saWN5XSAmJlxuICAgICAgdHlwZW9mIGFkYXB0ZXIucG9saWN5ICE9PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9USEVSX0NBVVNFLFxuICAgICAgICAnQXV0aEFkYXB0ZXIgcG9saWN5IGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4gVGhlIHZhbHVlIG11c3QgYmUgZWl0aGVyIFwic29sb1wiLCBcImFkZGl0aW9uYWxcIiwgXCJkZWZhdWx0XCIgb3IgdW5kZWZpbmVkICh3aWxsIGJlIGhhbmRsZWQgYXMgXCJkZWZhdWx0XCIpJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlQXV0aERhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBhZGFwdGVyLnZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgYWRhcHRlci52YWxpZGF0ZVNldFVwICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICB0eXBlb2YgYWRhcHRlci52YWxpZGF0ZUxvZ2luICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICB0eXBlb2YgYWRhcHRlci52YWxpZGF0ZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PVEhFUl9DQVVTRSxcbiAgICAgICAgJ0FkYXB0ZXIgaXMgbm90IGNvbmZpZ3VyZWQuIEltcGxlbWVudCBlaXRoZXIgdmFsaWRhdGVBdXRoRGF0YSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZzogdmFsaWRhdGVTZXRVcCwgdmFsaWRhdGVMb2dpbiBhbmQgdmFsaWRhdGVVcGRhdGUnXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBXaGVuIG1hc3RlcktleSBpcyBkZXRlY3RlZCwgd2Ugc2hvdWxkIHRyaWdnZXIgYSBsb2dnZWQgaW4gdXNlclxuICAgIGNvbnN0IGlzTG9nZ2VkSW4gPVxuICAgICAgKHJlcS5hdXRoLnVzZXIgJiYgdXNlciAmJiByZXEuYXV0aC51c2VyLmlkID09PSB1c2VyLmlkKSB8fCAodXNlciAmJiByZXEuYXV0aC5pc01hc3Rlcik7XG4gICAgbGV0IGhhc0F1dGhEYXRhQ29uZmlndXJlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHVzZXIgJiYgdXNlci5nZXQoJ2F1dGhEYXRhJykgJiYgdXNlci5nZXQoJ2F1dGhEYXRhJylbcHJvdmlkZXJdKSB7XG4gICAgICBoYXNBdXRoRGF0YUNvbmZpZ3VyZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0xvZ2dlZEluKSB7XG4gICAgICAvLyBVc2VyIGlzIHVwZGF0aW5nIHRoZWlyIGF1dGhEYXRhXG4gICAgICBpZiAoaGFzQXV0aERhdGFDb25maWd1cmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWV0aG9kOiAndmFsaWRhdGVVcGRhdGUnLFxuICAgICAgICAgIHZhbGlkYXRvcjogKCkgPT4gYWRhcHRlci52YWxpZGF0ZVVwZGF0ZShhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBTZXQgdXAgaWYgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSB0aGUgcHJvdmlkZXIgY29uZmlndXJlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kOiAndmFsaWRhdGVTZXRVcCcsXG4gICAgICAgIHZhbGlkYXRvcjogKCkgPT4gYWRhcHRlci52YWxpZGF0ZVNldFVwKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTm90IGxvZ2dlZCBpbiBhbmQgYXV0aERhdGEgaXMgY29uZmlndXJlZCBvbiB0aGUgdXNlclxuICAgIGlmIChoYXNBdXRoRGF0YUNvbmZpZ3VyZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1ldGhvZDogJ3ZhbGlkYXRlTG9naW4nLFxuICAgICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVMb2dpbihhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFVzZXIgbm90IGxvZ2dlZCBpbiBhbmQgdGhlIHByb3ZpZGVyIGlzIG5vdCBzZXQgdXAsIGZvciBleGFtcGxlIHdoZW4gYSBuZXcgdXNlclxuICAgIC8vIHNpZ25zIHVwIG9yIGFuIGV4aXN0aW5nIHVzZXIgdXNlcyBhIG5ldyBhdXRoIHByb3ZpZGVyXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogJ3ZhbGlkYXRlU2V0VXAnLFxuICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlU2V0VXAoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvYWRBdXRoQWRhcHRlcihwcm92aWRlciwgYXV0aE9wdGlvbnMpIHtcbiAgLy8gcHJvdmlkZXJzIGFyZSBhdXRoIHByb3ZpZGVycyBpbXBsZW1lbnRlZCBieSBkZWZhdWx0XG4gIGxldCBkZWZhdWx0QWRhcHRlciA9IHByb3ZpZGVyc1twcm92aWRlcl07XG4gIC8vIGF1dGhPcHRpb25zIGNhbiBjb250YWluIGNvbXBsZXRlIGN1c3RvbSBhdXRoIGFkYXB0ZXJzIG9yXG4gIC8vIGEgZGVmYXVsdCBhdXRoIGFkYXB0ZXIgbGlrZSBGYWNlYm9va1xuICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSBhdXRoT3B0aW9uc1twcm92aWRlcl07XG4gIGlmIChcbiAgICBwcm92aWRlck9wdGlvbnMgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdmlkZXJPcHRpb25zLCAnb2F1dGgyJykgJiZcbiAgICBwcm92aWRlck9wdGlvbnNbJ29hdXRoMiddID09PSB0cnVlXG4gICkge1xuICAgIGRlZmF1bHRBZGFwdGVyID0gb2F1dGgyO1xuICB9XG5cbiAgLy8gRGVmYXVsdCBwcm92aWRlciBub3QgZm91bmQgYW5kIGEgY3VzdG9tIGF1dGggcHJvdmlkZXIgd2FzIG5vdCBwcm92aWRlZFxuICBpZiAoIWRlZmF1bHRBZGFwdGVyICYmICFwcm92aWRlck9wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID1cbiAgICBkZWZhdWx0QWRhcHRlciBpbnN0YW5jZW9mIEF1dGhBZGFwdGVyID8gbmV3IGRlZmF1bHRBZGFwdGVyLmNvbnN0cnVjdG9yKCkgOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0QWRhcHRlcik7XG4gIGNvbnN0IGtleXMgPSBbXG4gICAgJ3ZhbGlkYXRlQXV0aERhdGEnLFxuICAgICd2YWxpZGF0ZUFwcElkJyxcbiAgICAndmFsaWRhdGVTZXRVcCcsXG4gICAgJ3ZhbGlkYXRlTG9naW4nLFxuICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgJ2NoYWxsZW5nZScsXG4gICAgJ3ZhbGlkYXRlT3B0aW9ucycsXG4gICAgJ3BvbGljeScsXG4gICAgJ2FmdGVyRmluZCcsXG4gIF07XG4gIGNvbnN0IGRlZmF1bHRBdXRoQWRhcHRlciA9IG5ldyBBdXRoQWRhcHRlcigpO1xuICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGFkYXB0ZXI/LltrZXldO1xuICAgIGlmIChcbiAgICAgIGV4aXN0aW5nICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIGV4aXN0aW5nLnRvU3RyaW5nKCkgPT09IGRlZmF1bHRBdXRoQWRhcHRlcltrZXldLnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIGFkYXB0ZXJba2V5XSA9IG51bGw7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgYXBwSWRzID0gcHJvdmlkZXJPcHRpb25zID8gcHJvdmlkZXJPcHRpb25zLmFwcElkcyA6IHVuZGVmaW5lZDtcblxuICAvLyBUcnkgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kc1xuICBpZiAocHJvdmlkZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0aW9uYWxBZGFwdGVyID0gbG9hZEFkYXB0ZXIocHJvdmlkZXJPcHRpb25zLCB1bmRlZmluZWQsIHByb3ZpZGVyT3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbmFsQWRhcHRlcikge1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25hbEFkYXB0ZXJba2V5XSkge1xuICAgICAgICAgIGFkYXB0ZXJba2V5XSA9IG9wdGlvbmFsQWRhcHRlcltrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKGFkYXB0ZXIudmFsaWRhdGVPcHRpb25zKSB7XG4gICAgYWRhcHRlci52YWxpZGF0ZU9wdGlvbnMocHJvdmlkZXJPcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiB7IGFkYXB0ZXIsIGFwcElkcywgcHJvdmlkZXJPcHRpb25zIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGF1dGhPcHRpb25zID0ge30sIGVuYWJsZUFub255bW91c1VzZXJzID0gdHJ1ZSkge1xuICBsZXQgX2VuYWJsZUFub255bW91c1VzZXJzID0gZW5hYmxlQW5vbnltb3VzVXNlcnM7XG4gIGNvbnN0IHNldEVuYWJsZUFub255bW91c1VzZXJzID0gZnVuY3Rpb24gKGVuYWJsZSkge1xuICAgIF9lbmFibGVBbm9ueW1vdXNVc2VycyA9IGVuYWJsZTtcbiAgfTtcbiAgLy8gVG8gaGFuZGxlIHRoZSB0ZXN0IGNhc2VzIG9uIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgZ2V0VmFsaWRhdG9yRm9yUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICBpZiAocHJvdmlkZXIgPT09ICdhbm9ueW1vdXMnICYmICFfZW5hYmxlQW5vbnltb3VzVXNlcnMpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkYXRvcjogdW5kZWZpbmVkIH07XG4gICAgfVxuICAgIGNvbnN0IGF1dGhBZGFwdGVyID0gbG9hZEF1dGhBZGFwdGVyKHByb3ZpZGVyLCBhdXRoT3B0aW9ucyk7XG4gICAgaWYgKCFhdXRoQWRhcHRlcikgeyByZXR1cm47IH1cbiAgICBjb25zdCB7IGFkYXB0ZXIsIGFwcElkcywgcHJvdmlkZXJPcHRpb25zIH0gPSBhdXRoQWRhcHRlcjtcbiAgICByZXR1cm4geyB2YWxpZGF0b3I6IGF1dGhEYXRhVmFsaWRhdG9yKHByb3ZpZGVyLCBhZGFwdGVyLCBhcHBJZHMsIHByb3ZpZGVyT3B0aW9ucyksIGFkYXB0ZXIgfTtcbiAgfTtcblxuICBjb25zdCBydW5BZnRlckZpbmQgPSBhc3luYyAocmVxLCBhdXRoRGF0YSkgPT4ge1xuICAgIGlmICghYXV0aERhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWRhcHRlcnMgPSBPYmplY3Qua2V5cyhhdXRoRGF0YSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhZGFwdGVycy5tYXAoYXN5bmMgcHJvdmlkZXIgPT4ge1xuICAgICAgICBjb25zdCBhdXRoQWRhcHRlciA9IGdldFZhbGlkYXRvckZvclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgaWYgKCFhdXRoQWRhcHRlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGFkYXB0ZXIsIHByb3ZpZGVyT3B0aW9ucyB9ID0gYXV0aEFkYXB0ZXI7XG4gICAgICAgIGNvbnN0IGFmdGVyRmluZCA9IGFkYXB0ZXIuYWZ0ZXJGaW5kO1xuICAgICAgICBpZiAoYWZ0ZXJGaW5kICYmIHR5cGVvZiBhZnRlckZpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0T2JqZWN0ID0ge1xuICAgICAgICAgICAgaXA6IHJlcS5jb25maWcuaXAsXG4gICAgICAgICAgICB1c2VyOiByZXEuYXV0aC51c2VyLFxuICAgICAgICAgICAgbWFzdGVyOiByZXEuYXV0aC5pc01hc3RlcixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFmdGVyRmluZC5jYWxsKFxuICAgICAgICAgICAgYWRhcHRlcixcbiAgICAgICAgICAgIGF1dGhEYXRhW3Byb3ZpZGVyXSxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgIHJlcXVlc3RPYmplY3QsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBhdXRoRGF0YVtwcm92aWRlcl0gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBhdXRoIHByb3ZpZGVyIG5hbWVzIHRoYXQgaGF2ZSBhIHZhbGlkIGFkYXB0ZXIgY29uZmlndXJlZC5cbiAgLy8gVGhpcyBpbmNsdWRlcyBib3RoIGJ1aWx0LWluIHByb3ZpZGVycyBhbmQgY3VzdG9tIHByb3ZpZGVycyBmcm9tIGF1dGhPcHRpb25zLlxuICBjb25zdCBnZXRQcm92aWRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYWxsUHJvdmlkZXJzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMocHJvdmlkZXJzKSwgLi4uT2JqZWN0LmtleXMoYXV0aE9wdGlvbnMpXSk7XG4gICAgaWYgKCFfZW5hYmxlQW5vbnltb3VzVXNlcnMpIHtcbiAgICAgIGFsbFByb3ZpZGVycy5kZWxldGUoJ2Fub255bW91cycpO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmFsbFByb3ZpZGVyc10uZmlsdGVyKHByb3ZpZGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAhIWxvYWRBdXRoQWRhcHRlcihwcm92aWRlciwgYXV0aE9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZ2V0VmFsaWRhdG9yRm9yUHJvdmlkZXIsXG4gICAgZ2V0UHJvdmlkZXJzLFxuICAgIHNldEVuYWJsZUFub255bW91c1VzZXJzLFxuICAgIHJ1bkFmdGVyRmluZCxcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQXV0aEFkYXB0ZXIgPSBsb2FkQXV0aEFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBQUEsY0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsWUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBS0EsSUFBQUcsUUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUssUUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBS0EsSUFBQU8sS0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsU0FBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQVMsSUFBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBWCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVcsTUFBQSxHQUFBWixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQVksR0FBQSxHQUFBYixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQWEsUUFBQSxHQUFBZCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQWMsUUFBQSxHQUFBZixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQWUsT0FBQSxHQUFBaEIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFnQixNQUFBLEdBQUFqQixzQkFBQSxDQUFBQyxPQUFBO0FBQTRCLFNBQUFELHVCQUFBa0IsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxD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
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _BaseCodeAuthAdapter = _interopRequireDefault(require("./BaseCodeAuthAdapter"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
/**
|
|
10
|
+
* Parse Server authentication adapter for Instagram.
|
|
11
|
+
*
|
|
12
|
+
* @class InstagramAdapter
|
|
13
|
+
* @param {Object} options - The adapter configuration options.
|
|
14
|
+
* @param {string} options.clientId - Your Instagram App Client ID. Required for secure authentication.
|
|
15
|
+
* @param {string} options.clientSecret - Your Instagram App Client Secret. Required for secure authentication.
|
|
16
|
+
* @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* ## Parse Server Configuration
|
|
20
|
+
* To configure Parse Server for Instagram authentication, use the following structure:
|
|
21
|
+
* ```json
|
|
22
|
+
* {
|
|
23
|
+
* "auth": {
|
|
24
|
+
* "instagram": {
|
|
25
|
+
* "clientId": "your-client-id",
|
|
26
|
+
* "clientSecret": "your-client-secret"
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
* ### Insecure Configuration (Not Recommended)
|
|
32
|
+
* ```json
|
|
33
|
+
* {
|
|
34
|
+
* "auth": {
|
|
35
|
+
* "instagram": {
|
|
36
|
+
* "enableInsecureAuth": true
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* The adapter requires the following `authData` fields:
|
|
43
|
+
* - **Secure Authentication**: `code`, `redirect_uri`.
|
|
44
|
+
* - **Insecure Authentication (Deprecated)**: `id`, `access_token`.
|
|
45
|
+
*
|
|
46
|
+
* ## Auth Payloads
|
|
47
|
+
* ### Secure Authentication Payload
|
|
48
|
+
* ```json
|
|
49
|
+
* {
|
|
50
|
+
* "instagram": {
|
|
51
|
+
* "code": "lmn789opq012rst345uvw",
|
|
52
|
+
* "redirect_uri": "https://example.com/callback"
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* ### Insecure Authentication Payload (Deprecated)
|
|
58
|
+
* ```json
|
|
59
|
+
* {
|
|
60
|
+
* "instagram": {
|
|
61
|
+
* "id": "1234567",
|
|
62
|
+
* "access_token": "AQXNnd2hIT6z9bHFzZz2Kp1ghiMz_RtyuvwXYZ123abc"
|
|
63
|
+
* }
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* ## Notes
|
|
68
|
+
* - `enableInsecureAuth` is **deprecated** and will be removed in future versions. Use secure authentication with `code` and `redirect_uri`.
|
|
69
|
+
* - Secure authentication exchanges the `code` and `redirect_uri` provided by the client for an access token using Instagram's OAuth flow.
|
|
70
|
+
*
|
|
71
|
+
* @see {@link https://developers.facebook.com/docs/instagram-basic-display-api/getting-started Instagram Basic Display API - Getting Started}
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
class InstagramAdapter extends _BaseCodeAuthAdapter.default {
|
|
75
|
+
constructor() {
|
|
76
|
+
super('Instagram');
|
|
77
|
+
}
|
|
78
|
+
async getAccessTokenFromCode(authData) {
|
|
79
|
+
const response = await fetch('https://api.instagram.com/oauth/access_token', {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: {
|
|
82
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
83
|
+
},
|
|
84
|
+
body: new URLSearchParams({
|
|
85
|
+
client_id: this.clientId,
|
|
86
|
+
client_secret: this.clientSecret,
|
|
87
|
+
grant_type: 'authorization_code',
|
|
88
|
+
redirect_uri: this.redirectUri,
|
|
89
|
+
code: authData.code
|
|
90
|
+
})
|
|
91
|
+
});
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Instagram API request failed.');
|
|
94
|
+
}
|
|
95
|
+
const data = await response.json();
|
|
96
|
+
if (data.error) {
|
|
97
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, data.error_description || data.error);
|
|
98
|
+
}
|
|
99
|
+
return data.access_token;
|
|
100
|
+
}
|
|
101
|
+
async getUserFromAccessToken(accessToken, authData) {
|
|
102
|
+
const apiURL = 'https://graph.instagram.com/';
|
|
103
|
+
const path = `${apiURL}me?fields=id&access_token=${accessToken}`;
|
|
104
|
+
const response = await fetch(path);
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Instagram API request failed.');
|
|
107
|
+
}
|
|
108
|
+
const user = await response.json();
|
|
109
|
+
if (user?.id !== authData.id) {
|
|
110
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Instagram auth is invalid for this user.');
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
id: user.id
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
var _default = exports.default = new InstagramAdapter();
|
|
118
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiSW5zdGFncmFtQWRhcHRlciIsIkJhc2VBdXRoQ29kZUFkYXB0ZXIiLCJjb25zdHJ1Y3RvciIsImdldEFjY2Vzc1Rva2VuRnJvbUNvZGUiLCJhdXRoRGF0YSIsInJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIlVSTFNlYXJjaFBhcmFtcyIsImNsaWVudF9pZCIsImNsaWVudElkIiwiY2xpZW50X3NlY3JldCIsImNsaWVudFNlY3JldCIsImdyYW50X3R5cGUiLCJyZWRpcmVjdF91cmkiLCJyZWRpcmVjdFVyaSIsImNvZGUiLCJvayIsIlBhcnNlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZGF0YSIsImpzb24iLCJlcnJvciIsImVycm9yX2Rlc2NyaXB0aW9uIiwiYWNjZXNzX3Rva2VuIiwiZ2V0VXNlckZyb21BY2Nlc3NUb2tlbiIsImFjY2Vzc1Rva2VuIiwiYXBpVVJMIiwicGF0aCIsInVzZXIiLCJpZCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2luc3RhZ3JhbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlIFNlcnZlciBhdXRoZW50aWNhdGlvbiBhZGFwdGVyIGZvciBJbnN0YWdyYW0uXG4gKlxuICogQGNsYXNzIEluc3RhZ3JhbUFkYXB0ZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIGFkYXB0ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY2xpZW50SWQgLSBZb3VyIEluc3RhZ3JhbSBBcHAgQ2xpZW50IElELiBSZXF1aXJlZCBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuY2xpZW50U2VjcmV0IC0gWW91ciBJbnN0YWdyYW0gQXBwIENsaWVudCBTZWNyZXQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUluc2VjdXJlQXV0aD1mYWxzZV0gLSAqKltERVBSRUNBVEVEXSoqIEVuYWJsZSBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbiAobm90IHJlY29tbWVuZGVkKS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICMjIFBhcnNlIFNlcnZlciBDb25maWd1cmF0aW9uXG4gKiBUbyBjb25maWd1cmUgUGFyc2UgU2VydmVyIGZvciBJbnN0YWdyYW0gYXV0aGVudGljYXRpb24sIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJhdXRoXCI6IHtcbiAqICAgICBcImluc3RhZ3JhbVwiOiB7XG4gKiAgICAgICBcImNsaWVudElkXCI6IFwieW91ci1jbGllbnQtaWRcIixcbiAqICAgICAgIFwiY2xpZW50U2VjcmV0XCI6IFwieW91ci1jbGllbnQtc2VjcmV0XCJcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogIyMjIEluc2VjdXJlIENvbmZpZ3VyYXRpb24gKE5vdCBSZWNvbW1lbmRlZClcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJhdXRoXCI6IHtcbiAqICAgICBcImluc3RhZ3JhbVwiOiB7XG4gKiAgICAgICBcImVuYWJsZUluc2VjdXJlQXV0aFwiOiB0cnVlXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgYWRhcHRlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGBhdXRoRGF0YWAgZmllbGRzOlxuICogLSAqKlNlY3VyZSBBdXRoZW50aWNhdGlvbioqOiBgY29kZWAsIGByZWRpcmVjdF91cmlgLlxuICogLSAqKkluc2VjdXJlIEF1dGhlbnRpY2F0aW9uIChEZXByZWNhdGVkKSoqOiBgaWRgLCBgYWNjZXNzX3Rva2VuYC5cbiAqXG4gKiAjIyBBdXRoIFBheWxvYWRzXG4gKiAjIyMgU2VjdXJlIEF1dGhlbnRpY2F0aW9uIFBheWxvYWRcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJpbnN0YWdyYW1cIjoge1xuICogICAgIFwiY29kZVwiOiBcImxtbjc4OW9wcTAxMnJzdDM0NXV2d1wiLFxuICogICAgIFwicmVkaXJlY3RfdXJpXCI6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jYWxsYmFja1wiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBJbnNlY3VyZSBBdXRoZW50aWNhdGlvbiBQYXlsb2FkIChEZXByZWNhdGVkKVxuICogYGBganNvblxuICoge1xuICogICBcImluc3RhZ3JhbVwiOiB7XG4gKiAgICAgXCJpZFwiOiBcIjEyMzQ1NjdcIixcbiAqICAgICBcImFjY2Vzc190b2tlblwiOiBcIkFRWE5uZDJoSVQ2ejliSEZ6WnoyS3AxZ2hpTXpfUnR5dXZ3WFlaMTIzYWJjXCJcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMgTm90ZXNcbiAqIC0gYGVuYWJsZUluc2VjdXJlQXV0aGAgaXMgKipkZXByZWNhdGVkKiogYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFVzZSBzZWN1cmUgYXV0aGVudGljYXRpb24gd2l0aCBgY29kZWAgYW5kIGByZWRpcmVjdF91cmlgLlxuICogLSBTZWN1cmUgYXV0aGVudGljYXRpb24gZXhjaGFuZ2VzIHRoZSBgY29kZWAgYW5kIGByZWRpcmVjdF91cmlgIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIGFuIGFjY2VzcyB0b2tlbiB1c2luZyBJbnN0YWdyYW0ncyBPQXV0aCBmbG93LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9pbnN0YWdyYW0tYmFzaWMtZGlzcGxheS1hcGkvZ2V0dGluZy1zdGFydGVkIEluc3RhZ3JhbSBCYXNpYyBEaXNwbGF5IEFQSSAtIEdldHRpbmcgU3RhcnRlZH1cbiAqL1xuXG5cbmltcG9ydCBCYXNlQXV0aENvZGVBZGFwdGVyIGZyb20gJy4vQmFzZUNvZGVBdXRoQWRhcHRlcic7XG5jbGFzcyBJbnN0YWdyYW1BZGFwdGVyIGV4dGVuZHMgQmFzZUF1dGhDb2RlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdJbnN0YWdyYW0nKTtcbiAgfVxuXG4gIGFzeW5jIGdldEFjY2Vzc1Rva2VuRnJvbUNvZGUoYXV0aERhdGEpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5pbnN0YWdyYW0uY29tL29hdXRoL2FjY2Vzc190b2tlbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuY2xpZW50U2VjcmV0LFxuICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgcmVkaXJlY3RfdXJpOiB0aGlzLnJlZGlyZWN0VXJpLFxuICAgICAgICBjb2RlOiBhdXRoRGF0YS5jb2RlXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdJbnN0YWdyYW0gQVBJIHJlcXVlc3QgZmFpbGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBkYXRhLmVycm9yX2Rlc2NyaXB0aW9uIHx8IGRhdGEuZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhLmFjY2Vzc190b2tlbjtcbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJGcm9tQWNjZXNzVG9rZW4oYWNjZXNzVG9rZW4sIGF1dGhEYXRhKSB7XG4gICAgY29uc3QgYXBpVVJMID0gJ2h0dHBzOi8vZ3JhcGguaW5zdGFncmFtLmNvbS8nO1xuICAgIGNvbnN0IHBhdGggPSBgJHthcGlVUkx9bWU/ZmllbGRzPWlkJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWA7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHBhdGgpO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdJbnN0YWdyYW0gQVBJIHJlcXVlc3QgZmFpbGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKHVzZXI/LmlkICE9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdJbnN0YWdyYW0gYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB1c2VyLmlkLFxuICAgIH1cblxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBJbnN0YWdyYW1BZGFwdGVyKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWtFQSxJQUFBQSxvQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQXdELFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBbEV4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
|