@medusajs/auth-google 0.0.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/README.md +11 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/services/google.d.ts +27 -0
- package/dist/services/google.d.ts.map +1 -0
- package/dist/services/google.js +127 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
## Testing
|
|
2
|
+
|
|
3
|
+
In order to manually test the flow, you can do the following:
|
|
4
|
+
|
|
5
|
+
1. Register an app in `https://console.cloud.google.com/apis/credentials/consent`
|
|
6
|
+
2. Generate clientID and clientSecret credentials in the console
|
|
7
|
+
3. Replace the values in the test with your credentials
|
|
8
|
+
4. Remove the `server.listen()` call
|
|
9
|
+
5. Run the tests, get the `location` value from the `authenticate` test, open the browser
|
|
10
|
+
6. Once redirected, copy the `code` param from the URL, and add it in one of the `callback` success tests
|
|
11
|
+
7. Once you run the tests, you should get back an access token, id token, and so on.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAKvD,QAAA,MAAM,cAAc,EAAE,qBAErB,CAAA;AAED,eAAe,cAAc,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const google_1 = require("./services/google");
|
|
4
|
+
const services = [google_1.GoogleAuthService];
|
|
5
|
+
const providerExport = {
|
|
6
|
+
services,
|
|
7
|
+
};
|
|
8
|
+
exports.default = providerExport;
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSw4Q0FBcUQ7QUFFckQsTUFBTSxRQUFRLEdBQUcsQ0FBQywwQkFBaUIsQ0FBQyxDQUFBO0FBRXBDLE1BQU0sY0FBYyxHQUEwQjtJQUM1QyxRQUFRO0NBQ1QsQ0FBQTtBQUVELGtCQUFlLGNBQWMsQ0FBQSJ9
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Logger, GoogleAuthProviderOptions, AuthenticationResponse, AuthenticationInput, AuthIdentityProviderService } from "@medusajs/types";
|
|
2
|
+
import { AbstractAuthModuleProvider } from "@medusajs/utils";
|
|
3
|
+
type InjectedDependencies = {
|
|
4
|
+
logger: Logger;
|
|
5
|
+
};
|
|
6
|
+
interface LocalServiceConfig extends GoogleAuthProviderOptions {
|
|
7
|
+
}
|
|
8
|
+
export declare class GoogleAuthService extends AbstractAuthModuleProvider {
|
|
9
|
+
protected config_: LocalServiceConfig;
|
|
10
|
+
protected logger_: Logger;
|
|
11
|
+
constructor({ logger }: InjectedDependencies, options: GoogleAuthProviderOptions);
|
|
12
|
+
authenticate(req: AuthenticationInput): Promise<AuthenticationResponse>;
|
|
13
|
+
validateCallback(req: AuthenticationInput, authIdentityService: AuthIdentityProviderService): Promise<AuthenticationResponse>;
|
|
14
|
+
verify_(idToken: string | undefined, authIdentityService: AuthIdentityProviderService): Promise<{
|
|
15
|
+
success: boolean;
|
|
16
|
+
error: any;
|
|
17
|
+
authIdentity?: undefined;
|
|
18
|
+
} | {
|
|
19
|
+
success: boolean;
|
|
20
|
+
authIdentity: any;
|
|
21
|
+
error?: undefined;
|
|
22
|
+
}>;
|
|
23
|
+
private getRedirect;
|
|
24
|
+
private validateConfig;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/services/google.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,0BAA0B,EAAe,MAAM,iBAAiB,CAAA;AAGzE,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,UAAU,kBAAmB,SAAQ,yBAAyB;CAAG;AAGjE,qBAAa,iBAAkB,SAAQ,0BAA0B;IAC/D,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACrC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAA;gBAGvB,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAChC,OAAO,EAAE,yBAAyB;IAQ9B,YAAY,CAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,sBAAsB,CAAC;IAW5B,gBAAgB,CACpB,GAAG,EAAE,mBAAmB,EACxB,mBAAmB,EAAE,2BAA2B,GAC/C,OAAO,CAAC,sBAAsB,CAAC;IAmD5B,OAAO,CACX,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,mBAAmB,EAAE,2BAA2B;;;;;;;;;IAmDlD,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,cAAc;CAavB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
exports.GoogleAuthService = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/utils");
|
|
8
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
9
|
+
// TODO: Add state param that is stored in Redis, to prevent CSRF attacks
|
|
10
|
+
class GoogleAuthService extends utils_1.AbstractAuthModuleProvider {
|
|
11
|
+
constructor({ logger }, options) {
|
|
12
|
+
super({}, { provider: "google", displayName: "Google Authentication" });
|
|
13
|
+
this.validateConfig(options);
|
|
14
|
+
this.config_ = options;
|
|
15
|
+
this.logger_ = logger;
|
|
16
|
+
}
|
|
17
|
+
async authenticate(req) {
|
|
18
|
+
if (req.query?.error) {
|
|
19
|
+
return {
|
|
20
|
+
success: false,
|
|
21
|
+
error: `${req.query.error_description}, read more at: ${req.query.error_uri}`,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return this.getRedirect(this.config_);
|
|
25
|
+
}
|
|
26
|
+
async validateCallback(req, authIdentityService) {
|
|
27
|
+
if (req.query && req.query.error) {
|
|
28
|
+
return {
|
|
29
|
+
success: false,
|
|
30
|
+
error: `${req.query.error_description}, read more at: ${req.query.error_uri}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const code = req.query?.code ?? req.body?.code;
|
|
34
|
+
if (!code) {
|
|
35
|
+
return { success: false, error: "No code provided" };
|
|
36
|
+
}
|
|
37
|
+
const params = `client_id=${this.config_.clientID}&client_secret=${this.config_.clientSecret}&code=${code}&redirect_uri=${encodeURIComponent(this.config_.callbackURL)}&grant_type=authorization_code`;
|
|
38
|
+
const exchangeTokenUrl = new URL(`https://oauth2.googleapis.com/token?${params}`);
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(exchangeTokenUrl.toString(), {
|
|
41
|
+
method: "POST",
|
|
42
|
+
}).then((r) => {
|
|
43
|
+
if (!r.ok) {
|
|
44
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Could not exchange token, ${r.status}, ${r.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
return r.json();
|
|
47
|
+
});
|
|
48
|
+
const { authIdentity, success } = await this.verify_(response.id_token, authIdentityService);
|
|
49
|
+
return {
|
|
50
|
+
success,
|
|
51
|
+
authIdentity,
|
|
52
|
+
successRedirectUrl: this.config_.successRedirectUrl,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return { success: false, error: error.message };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async verify_(idToken, authIdentityService) {
|
|
60
|
+
if (!idToken) {
|
|
61
|
+
return { success: false, error: "No ID found" };
|
|
62
|
+
}
|
|
63
|
+
const jwtData = jsonwebtoken_1.default.decode(idToken, {
|
|
64
|
+
complete: true,
|
|
65
|
+
});
|
|
66
|
+
const payload = jwtData.payload;
|
|
67
|
+
if (!payload.email_verified) {
|
|
68
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email not verified, cannot proceed with authentication");
|
|
69
|
+
}
|
|
70
|
+
// TODO: We should probably use something else than email here, like the `sub` field (which is more constant than the email)
|
|
71
|
+
const entity_id = payload.email;
|
|
72
|
+
const userMetadata = {
|
|
73
|
+
name: payload.name,
|
|
74
|
+
picture: payload.picture,
|
|
75
|
+
given_name: payload.given_name,
|
|
76
|
+
family_name: payload.family_name,
|
|
77
|
+
};
|
|
78
|
+
let authIdentity;
|
|
79
|
+
try {
|
|
80
|
+
authIdentity = await authIdentityService.retrieve({
|
|
81
|
+
entity_id,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error.type === utils_1.MedusaError.Types.NOT_FOUND) {
|
|
86
|
+
const createdAuthIdentity = await authIdentityService.create({
|
|
87
|
+
entity_id,
|
|
88
|
+
user_metadata: userMetadata,
|
|
89
|
+
});
|
|
90
|
+
authIdentity = createdAuthIdentity;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return { success: false, error: error.message };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
success: true,
|
|
98
|
+
authIdentity,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
getRedirect({ clientID, callbackURL }) {
|
|
102
|
+
const redirectUrlParam = `redirect_uri=${encodeURIComponent(callbackURL)}`;
|
|
103
|
+
const clientIdParam = `client_id=${clientID}`;
|
|
104
|
+
const responseTypeParam = "response_type=code";
|
|
105
|
+
const scopeParam = "scope=email+profile+openid";
|
|
106
|
+
const authUrl = new URL(`https://accounts.google.com/o/oauth2/v2/auth?${[
|
|
107
|
+
redirectUrlParam,
|
|
108
|
+
clientIdParam,
|
|
109
|
+
responseTypeParam,
|
|
110
|
+
scopeParam,
|
|
111
|
+
].join("&")}`);
|
|
112
|
+
return { success: true, location: authUrl.toString() };
|
|
113
|
+
}
|
|
114
|
+
validateConfig(config) {
|
|
115
|
+
if (!config.clientID) {
|
|
116
|
+
throw new Error("Google clientID is required");
|
|
117
|
+
}
|
|
118
|
+
if (!config.clientSecret) {
|
|
119
|
+
throw new Error("Google clientSecret is required");
|
|
120
|
+
}
|
|
121
|
+
if (!config.callbackURL) {
|
|
122
|
+
throw new Error("Google callbackUrl is required");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.GoogleAuthService = GoogleAuthService;
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2dvb2dsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFPQSwyQ0FBeUU7QUFDekUsZ0VBQThDO0FBUTlDLHlFQUF5RTtBQUN6RSxNQUFhLGlCQUFrQixTQUFRLGtDQUEwQjtJQUkvRCxZQUNFLEVBQUUsTUFBTSxFQUF3QixFQUNoQyxPQUFrQztRQUVsQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQ2hCLEdBQXdCO1FBRXhCLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNyQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLG1CQUFtQixHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTthQUM5RSxDQUFBO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBd0IsRUFDeEIsbUJBQWdEO1FBRWhELElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FB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
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@medusajs/auth-google",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Google OAuth authentication provider for Medusa",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/medusajs/medusa",
|
|
9
|
+
"directory": "packages/modules/providers/auth-google"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"author": "Medusa",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"prepublishOnly": "cross-env NODE_ENV=production tsc --build",
|
|
21
|
+
"test": "jest --passWithNoTests src",
|
|
22
|
+
"test:integration": "jest --forceExit -- integration-tests/**/__tests__/**/*.spec.ts",
|
|
23
|
+
"build": "rimraf dist && tsc -p ./tsconfig.json",
|
|
24
|
+
"watch": "tsc --watch"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@medusajs/types": "^1.11.16",
|
|
28
|
+
"@types/simple-oauth2": "^5.0.7",
|
|
29
|
+
"cross-env": "^5.2.1",
|
|
30
|
+
"jest": "^29.7.0",
|
|
31
|
+
"msw": "^2.3.0",
|
|
32
|
+
"rimraf": "^5.0.1",
|
|
33
|
+
"typescript": "^5.1.6"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@medusajs/utils": "^1.11.7",
|
|
37
|
+
"jsonwebtoken": "^9.0.2"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"medusa-provider",
|
|
41
|
+
"medusa-provider-auth-google"
|
|
42
|
+
]
|
|
43
|
+
}
|