@lodashventure/medusa-login-provider 0.0.6
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.
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const service_1 = __importDefault(require("./service"));
|
|
8
|
+
exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.AUTH, {
|
|
9
|
+
services: [service_1.default],
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2xpbmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBb0U7QUFDcEUsd0RBQTRDO0FBRTVDLGtCQUFlLElBQUEsc0JBQWMsRUFBQyxlQUFPLENBQUMsSUFBSSxFQUFFO0lBQzFDLFFBQVEsRUFBRSxDQUFDLGlCQUFtQixDQUFDO0NBQ2hDLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
9
|
+
class LineProviderService extends utils_1.AbstractAuthModuleProvider {
|
|
10
|
+
constructor({ logger }, options) {
|
|
11
|
+
super();
|
|
12
|
+
this.logger_ = logger;
|
|
13
|
+
this.options_ = options;
|
|
14
|
+
}
|
|
15
|
+
static validateOptions(options) {
|
|
16
|
+
if (!options.lineChannelId) {
|
|
17
|
+
throw new Error("line channel id is required");
|
|
18
|
+
}
|
|
19
|
+
if (!options.lineChannelSecret) {
|
|
20
|
+
throw new Error("line channel secret is required");
|
|
21
|
+
}
|
|
22
|
+
if (!options.lineChannelId) {
|
|
23
|
+
throw new Error("redirect url is required");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async register(data, authIdentityService) {
|
|
27
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Line does not support registration. Use method `authenticate` instead.");
|
|
28
|
+
}
|
|
29
|
+
async authenticate(data, authIdentityService) {
|
|
30
|
+
const query = data.query ?? {};
|
|
31
|
+
const body = data.body ?? {};
|
|
32
|
+
if (query.error) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: `${query.error_description}, read more at: ${query.error_uri}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const stateKey = crypto_1.default.randomBytes(32).toString("hex");
|
|
39
|
+
const state = {
|
|
40
|
+
callback_url: body?.callback_url ?? this.options_.lineRedirectUrl,
|
|
41
|
+
};
|
|
42
|
+
await authIdentityService.setState(stateKey, state);
|
|
43
|
+
return this.getRedirect(this.options_.lineChannelId, state.callback_url, stateKey);
|
|
44
|
+
}
|
|
45
|
+
async validateCallback(req, authIdentityService) {
|
|
46
|
+
const query = req.query ?? {};
|
|
47
|
+
const body = req.body ?? {};
|
|
48
|
+
if (query.error) {
|
|
49
|
+
return {
|
|
50
|
+
success: false,
|
|
51
|
+
error: `${query.error_description}, read more at: ${query.error_uri}`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const code = query?.code ?? body?.code;
|
|
55
|
+
if (!code) {
|
|
56
|
+
return { success: false, error: "No code provided" };
|
|
57
|
+
}
|
|
58
|
+
const state = await authIdentityService.getState(query?.state);
|
|
59
|
+
if (!state) {
|
|
60
|
+
return { success: false, error: "No state provided, or session expired" };
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const response = await fetch("https://api.line.me/oauth2/v2.1/token", {
|
|
64
|
+
method: "POST",
|
|
65
|
+
headers: {
|
|
66
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
67
|
+
},
|
|
68
|
+
body: new URLSearchParams({
|
|
69
|
+
grant_type: "authorization_code",
|
|
70
|
+
code: code,
|
|
71
|
+
client_id: this.options_.lineChannelId,
|
|
72
|
+
client_secret: this.options_.lineChannelSecret,
|
|
73
|
+
redirect_uri: state.callback_url,
|
|
74
|
+
}),
|
|
75
|
+
}).then((r) => {
|
|
76
|
+
if (!r.ok) {
|
|
77
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Could not exchange token, ${r.status}, ${r.statusText}`);
|
|
78
|
+
}
|
|
79
|
+
return r.json();
|
|
80
|
+
});
|
|
81
|
+
const { authIdentity, success } = await this.verify_(response.id_token, authIdentityService);
|
|
82
|
+
return {
|
|
83
|
+
success,
|
|
84
|
+
authIdentity,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return { success: false, error: error.message };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async verify_(idToken, authIdentityService) {
|
|
92
|
+
if (!idToken) {
|
|
93
|
+
return { success: false, error: "No ID found" };
|
|
94
|
+
}
|
|
95
|
+
const jwtData = jsonwebtoken_1.default.decode(idToken, {
|
|
96
|
+
complete: true,
|
|
97
|
+
});
|
|
98
|
+
const payload = jwtData.payload;
|
|
99
|
+
const entity_id = payload.sub;
|
|
100
|
+
const userMetadata = {
|
|
101
|
+
name: payload.name,
|
|
102
|
+
picture: payload.picture,
|
|
103
|
+
};
|
|
104
|
+
let authIdentity;
|
|
105
|
+
try {
|
|
106
|
+
authIdentity = await authIdentityService.retrieve({
|
|
107
|
+
entity_id,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error.type === utils_1.MedusaError.Types.NOT_FOUND) {
|
|
112
|
+
const createdAuthIdentity = await authIdentityService.create({
|
|
113
|
+
entity_id,
|
|
114
|
+
user_metadata: userMetadata,
|
|
115
|
+
});
|
|
116
|
+
authIdentity = createdAuthIdentity;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return { success: false, error: error.message };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
authIdentity,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
getRedirect(clientId, callbackUrl, stateKey) {
|
|
128
|
+
const authUrl = new URL(`https://access.line.me/oauth2/v2.1/authorize`);
|
|
129
|
+
authUrl.searchParams.set("response_type", "code");
|
|
130
|
+
authUrl.searchParams.set("scope", "profile openid");
|
|
131
|
+
authUrl.searchParams.set("client_id", clientId);
|
|
132
|
+
authUrl.searchParams.set("redirect_uri", callbackUrl);
|
|
133
|
+
authUrl.searchParams.set("state", stateKey);
|
|
134
|
+
return { success: true, location: authUrl.toString() };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
LineProviderService.identifier = "line";
|
|
138
|
+
LineProviderService.DISPLAY_NAME = "LINE";
|
|
139
|
+
exports.default = LineProviderService;
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvbGluZS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBR21DO0FBT25DLGdFQUErQztBQUMvQyxvREFBNEI7QUFZNUIsTUFBTSxtQkFBb0IsU0FBUSxrQ0FBMEI7SUFNMUQsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFnQjtRQUM1RCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQXlCO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQ1osSUFBeUIsRUFDekIsbUJBQWdEO1FBRWhELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLHdFQUF3RSxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQ2hCLElBQXlCLEVBQ3pCLG1CQUFnRDtRQUVoRCxNQUFNLEtBQUssR0FBMkIsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7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
|
package/README.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Medusa Plugin Login-Provider
|
|
2
|
+
|
|
3
|
+
## How to install
|
|
4
|
+
1. yarn add medusa-login-provider
|
|
5
|
+
|
|
6
|
+
2. configure your medusa backend `medusa-config.ts`
|
|
7
|
+
```ts
|
|
8
|
+
module.exports = defineConfig({
|
|
9
|
+
// ... rest of the config
|
|
10
|
+
modules: [
|
|
11
|
+
{
|
|
12
|
+
resolve: "@medusajs/medusa/auth",
|
|
13
|
+
options: {
|
|
14
|
+
providers: [
|
|
15
|
+
// default provider (don't remove this if you want to use email+pass)
|
|
16
|
+
{
|
|
17
|
+
resolve: "@medusajs/medusa/auth-emailpass",
|
|
18
|
+
dependencies: [Modules.CACHE, ContainerRegistrationKeys.LOGGER],
|
|
19
|
+
id: "emailpass",
|
|
20
|
+
},
|
|
21
|
+
// line provider
|
|
22
|
+
{
|
|
23
|
+
resolve: "medusa-login-provider/providers/line",
|
|
24
|
+
id: "line",
|
|
25
|
+
dependencies: [Modules.CACHE, ContainerRegistrationKeys.LOGGER],
|
|
26
|
+
options: {
|
|
27
|
+
lineChannelId: process.env.LINE_CHANNEL_ID,
|
|
28
|
+
lineChannelSecret: process.env.LINE_CHANNEL_SECRET,
|
|
29
|
+
lineRedirectUrl: process.env.LINE_REDIRECT_URL,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
3. add callback url to your line channel
|
|
41
|
+
```
|
|
42
|
+
https://your.medusa.core.domain/auth/customer/line/callback/
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
4. add variables to .env
|
|
46
|
+
```
|
|
47
|
+
LINE_CHANNEL_ID=<line-channel-id>
|
|
48
|
+
LINE_CHANNEL_SECRET=<line-channel-secret>
|
|
49
|
+
LINE_REDIRECT_URL=<line-redirect-url>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
all done now just start your medusa backend
|
|
53
|
+
`yarn dev` `yarn start` or whatever you use to start your backend
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## login with line
|
|
57
|
+
1. create login button or just make a call to `GET https://your.medusa.core.domain/auth/user/line`
|
|
58
|
+
2. you'll get response with `token`
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lodashventure/medusa-login-provider",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"description": "A starter for Medusa plugins.",
|
|
5
|
+
"author": "Medusa (https://medusajs.com)",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"files": [
|
|
8
|
+
".medusa/server"
|
|
9
|
+
],
|
|
10
|
+
"exports": {
|
|
11
|
+
"./package.json": "./package.json",
|
|
12
|
+
"./workflows": "./.medusa/server/src/workflows/index.js",
|
|
13
|
+
"./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
|
|
14
|
+
"./modules/*": "./.medusa/server/src/modules/*/index.js",
|
|
15
|
+
"./providers/*": "./.medusa/server/src/providers/*/index.js",
|
|
16
|
+
"./*": "./.medusa/server/src/*.js"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"medusa",
|
|
20
|
+
"plugin",
|
|
21
|
+
"medusa-plugin-other",
|
|
22
|
+
"medusa-plugin",
|
|
23
|
+
"medusa-v2"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "medusa plugin:build",
|
|
27
|
+
"dev": "medusa plugin:develop",
|
|
28
|
+
"prepublishOnly": "medusa plugin:build"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@medusajs/admin-sdk": "2.4.0",
|
|
32
|
+
"@medusajs/cli": "2.4.0",
|
|
33
|
+
"@medusajs/framework": "2.4.0",
|
|
34
|
+
"@medusajs/icons": "2.4.0",
|
|
35
|
+
"@medusajs/medusa": "2.4.0",
|
|
36
|
+
"@medusajs/test-utils": "2.4.0",
|
|
37
|
+
"@medusajs/ui": "4.0.4",
|
|
38
|
+
"@mikro-orm/cli": "6.4.3",
|
|
39
|
+
"@mikro-orm/core": "6.4.3",
|
|
40
|
+
"@mikro-orm/knex": "6.4.3",
|
|
41
|
+
"@mikro-orm/migrations": "6.4.3",
|
|
42
|
+
"@mikro-orm/postgresql": "6.4.3",
|
|
43
|
+
"@swc/core": "1.5.7",
|
|
44
|
+
"@types/jsonwebtoken": "^9",
|
|
45
|
+
"@types/node": "^20.0.0",
|
|
46
|
+
"@types/react": "^18.3.2",
|
|
47
|
+
"@types/react-dom": "^18.2.25",
|
|
48
|
+
"awilix": "^8.0.1",
|
|
49
|
+
"pg": "^8.13.0",
|
|
50
|
+
"prop-types": "^15.8.1",
|
|
51
|
+
"react": "^18.2.0",
|
|
52
|
+
"react-dom": "^18.2.0",
|
|
53
|
+
"ts-node": "^10.9.2",
|
|
54
|
+
"typescript": "^5.6.2",
|
|
55
|
+
"vite": "^5.2.11",
|
|
56
|
+
"yalc": "^1.0.0-pre.53"
|
|
57
|
+
},
|
|
58
|
+
"peerDependencies": {
|
|
59
|
+
"@medusajs/admin-sdk": "2.4.0",
|
|
60
|
+
"@medusajs/cli": "2.4.0",
|
|
61
|
+
"@medusajs/framework": "2.4.0",
|
|
62
|
+
"@medusajs/icons": "2.4.0",
|
|
63
|
+
"@medusajs/medusa": "2.4.0",
|
|
64
|
+
"@medusajs/test-utils": "2.4.0",
|
|
65
|
+
"@medusajs/ui": "4.0.3",
|
|
66
|
+
"@mikro-orm/cli": "6.4.3",
|
|
67
|
+
"@mikro-orm/core": "6.4.3",
|
|
68
|
+
"@mikro-orm/knex": "6.4.3",
|
|
69
|
+
"@mikro-orm/migrations": "6.4.3",
|
|
70
|
+
"@mikro-orm/postgresql": "6.4.3",
|
|
71
|
+
"awilix": "^8.0.1",
|
|
72
|
+
"pg": "^8.13.0"
|
|
73
|
+
},
|
|
74
|
+
"engines": {
|
|
75
|
+
"node": ">=20"
|
|
76
|
+
},
|
|
77
|
+
"dependencies": {
|
|
78
|
+
"jsonwebtoken": "^9.0.2"
|
|
79
|
+
}
|
|
80
|
+
}
|