From 16c9d957cc2fa5801b178c26fcc2bd7ca6004b80 Mon Sep 17 00:00:00 2001 From: Yingbei Date: Sat, 25 Jan 2025 13:54:26 +0800 Subject: [PATCH 1/6] linkedin Oauth app --- apiclient/types/oauthapp.go | 1 + pkg/gateway/types/oauth_apps.go | 6 ++ .../oauth-apps/OAuthAppTypeIcon.tsx | 2 + ui/admin/app/lib/model/oauthApps/index.ts | 2 + .../app/lib/model/oauthApps/oauth-helpers.ts | 1 + .../lib/model/oauthApps/providers/linkedin.ts | 89 ++++++++++++++++++ ui/admin/public/assets/linkedin_icon.png | Bin 0 -> 8529 bytes 7 files changed, 101 insertions(+) create mode 100644 ui/admin/app/lib/model/oauthApps/providers/linkedin.ts create mode 100644 ui/admin/public/assets/linkedin_icon.png diff --git a/apiclient/types/oauthapp.go b/apiclient/types/oauthapp.go index ebdab3715..cbc41c20d 100644 --- a/apiclient/types/oauthapp.go +++ b/apiclient/types/oauthapp.go @@ -10,6 +10,7 @@ const ( OAuthAppTypeGoogle OAuthAppType = "google" OAuthAppTypeSalesforce OAuthAppType = "salesforce" OAuthAppTypeZoom OAuthAppType = "zoom" + OAuthAppTypeLinkedIn OAuthAppType = "linkedin" OAuthAppTypeCustom OAuthAppType = "custom" ) diff --git a/pkg/gateway/types/oauth_apps.go b/pkg/gateway/types/oauth_apps.go index 89cafbbb0..61e524f1b 100644 --- a/pkg/gateway/types/oauth_apps.go +++ b/pkg/gateway/types/oauth_apps.go @@ -31,6 +31,9 @@ const ( ZoomAuthorizeURL = "https://zoom.us/oauth/authorize" ZoomTokenURL = "https://zoom.us/oauth/token" + + LinkedInAuthorizeURL = "https://www.linkedin.com/oauth/v2/authorization" + LinkedInTokenURL = "https://www.linkedin.com/oauth/v2/accessToken" ) var ( @@ -75,6 +78,9 @@ func ValidateAndSetDefaultsOAuthAppManifest(r *types.OAuthAppManifest, create bo case types.OAuthAppTypeZoom: r.AuthURL = ZoomAuthorizeURL r.TokenURL = ZoomTokenURL + case types.OAuthAppTypeLinkedIn: + r.AuthURL = LinkedInAuthorizeURL + r.TokenURL = LinkedInTokenURL case types.OAuthAppTypeSalesforce: salesforceAuthorizeFragment := "/services/oauth2/authorize" salesforceTokenFragment := "/services/oauth2/token" diff --git a/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx b/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx index bbc515b1a..9768bec4c 100644 --- a/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx +++ b/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx @@ -8,6 +8,7 @@ import { FaMicrosoft, FaSalesforce, FaSlack, + FaLinkedin, } from "react-icons/fa"; import { OAuthProvider } from "~/lib/model/oauthApps/oauth-helpers"; @@ -22,6 +23,7 @@ const IconMap = { [OAuthProvider.Microsoft365]: FaMicrosoft, [OAuthProvider.Notion]: NotionLogoIcon, [OAuthProvider.Zoom]: BiLogoZoom, + [OAuthProvider.LinkedIn]: FaLinkedin, [OAuthProvider.Custom]: KeyIcon, }; diff --git a/ui/admin/app/lib/model/oauthApps/index.ts b/ui/admin/app/lib/model/oauthApps/index.ts index c1edfe18b..93b71b847 100644 --- a/ui/admin/app/lib/model/oauthApps/index.ts +++ b/ui/admin/app/lib/model/oauthApps/index.ts @@ -12,6 +12,7 @@ import { NotionOAuthApp } from "~/lib/model/oauthApps/providers/notion"; import { SalesforceOAuthApp } from "~/lib/model/oauthApps/providers/salesforce"; import { SlackOAuthApp } from "~/lib/model/oauthApps/providers/slack"; import { ZoomOAuthApp } from "~/lib/model/oauthApps/providers/zoom"; +import { LinkedInOAuthApp } from "~/lib/model/oauthApps/providers/linkedin"; import { EntityMeta } from "~/lib/model/primitives"; export const OAuthAppSpecMap = { @@ -23,6 +24,7 @@ export const OAuthAppSpecMap = { [OAuthProvider.Salesforce]: SalesforceOAuthApp, [OAuthProvider.Notion]: NotionOAuthApp, [OAuthProvider.Zoom]: ZoomOAuthApp, + [OAuthProvider.LinkedIn]: LinkedInOAuthApp, // Custom OAuth apps are intentionally omitted from the map. // They are handled separately } as const; diff --git a/ui/admin/app/lib/model/oauthApps/oauth-helpers.ts b/ui/admin/app/lib/model/oauthApps/oauth-helpers.ts index 2b8cd06a0..4002c145f 100644 --- a/ui/admin/app/lib/model/oauthApps/oauth-helpers.ts +++ b/ui/admin/app/lib/model/oauthApps/oauth-helpers.ts @@ -11,6 +11,7 @@ export const OAuthProvider = { Salesforce: "salesforce", Notion: "notion", Zoom: "zoom", + LinkedIn: "linkedin", Custom: "custom", } as const; export type OAuthProvider = (typeof OAuthProvider)[keyof typeof OAuthProvider]; diff --git a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts new file mode 100644 index 000000000..ee5ba8b7f --- /dev/null +++ b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts @@ -0,0 +1,89 @@ +import { z } from "zod"; + +import { + OAuthAppSpec, + OAuthFormStep, + getOAuthLinks, +} from "~/lib/model/oauthApps/oauth-helpers"; +import { assetUrl } from "~/lib/utils"; + +const schema = z.object({ + clientID: z.string().min(1, "Client ID is required"), + clientSecret: z.string().min(1, "Client Secret is required"), +}); + +const scopes = [ + "r_basicprofile", + "r_emailaddress", + "r_liteprofile", + "w_member_social", +]; + +const steps: OAuthFormStep>[] = [ + { + type: "markdown", + text: + "### Step 1: Create a new app in Zoom App Marketplace\n" + + "If you already have an app, you can skip to Step 2.\n\n" + + "- Ensure you are logged into your preferred Zoom account.\n" + + "- From the [Zoom App Marketplace](https://marketplace.zoom.us/), hover over the **Develop** box on the top right corner and then select **Build App**.\n" + + "- When asked `What kind of app are you creating?` in the pop-up window, select **General App** and click **Create**.\n" + + "- Now You should be redirected to the **App Basic Information** page.\n" + + "- In the **Select how the app is managed** section, make sure it is set to **User-managed**.\n" + + "- Scroll down to the **Oauth Information** section, copy the url below and paste it into the **OAuth Redirect URL** field.\n", + }, + { + type: "copy", + text: getOAuthLinks("linkedin").redirectURL, + }, + { + type: "markdown", + text: "- Click **Continue** at the bottom and then click **Scopes** on the left sidebar to continue.\n", + }, + { + type: "markdown", + text: + "### Step 2: Configure the app's necessary scopes\n" + + "- From the [Zoom App Management Page](https://marketplace.zoom.us/user/build), click on the app you created and click **Scopes** on the left sidebar.\n" + + "(You will already be on this page if you've completed step 1)\n" + + "- Click on **Add Scopes** to add necessary scopes for the zoom tool. Ensure the following scopes are added:\n", + }, + { + type: "sectionGroup", + sections: [ + { + title: "Scopes: ", + displayStepsInline: true, + defaultOpen: true, + steps: scopes.map((scope) => ({ + type: "copy", + text: scope, + })), + }, + ], + }, + { + type: "markdown", + text: + "### Step 3: Register your App with Obot\n" + + "- **Client ID** and **Client Secret** can be found in the **App Credentials** box, located at the top of the left sidebar. Alternatively, you can find them in the **App Credentials** section of the **Basic Information** page.\n" + + "- Copy the **Client ID** and **Client Secret** and paste them into the respective fields below.\n", + }, + { type: "input", input: "clientID", label: "Client ID" }, + { + type: "input", + input: "clientSecret", + label: "Client Secret", + inputType: "password", + }, +]; + +export const LinkedInOAuthApp = { + schema, + alias: "linkedin", + type: "linkedin", + displayName: "LinkedIn", + logo: assetUrl("/assets/linkedin_icon.png"), + steps: steps, + noGatewayIntegration: true, +} satisfies OAuthAppSpec; diff --git a/ui/admin/public/assets/linkedin_icon.png b/ui/admin/public/assets/linkedin_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f94725bfe838630b0f4dc797ea25b8c070ea078 GIT binary patch literal 8529 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 Date: Sat, 25 Jan 2025 14:01:50 +0800 Subject: [PATCH 2/6] link --- ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx | 2 +- ui/admin/app/lib/model/oauthApps/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx b/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx index 9768bec4c..6033e9c08 100644 --- a/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx +++ b/ui/admin/app/components/oauth-apps/OAuthAppTypeIcon.tsx @@ -5,10 +5,10 @@ import { FaAtlassian, FaGithub, FaGoogle, + FaLinkedin, FaMicrosoft, FaSalesforce, FaSlack, - FaLinkedin, } from "react-icons/fa"; import { OAuthProvider } from "~/lib/model/oauthApps/oauth-helpers"; diff --git a/ui/admin/app/lib/model/oauthApps/index.ts b/ui/admin/app/lib/model/oauthApps/index.ts index 93b71b847..231ed468a 100644 --- a/ui/admin/app/lib/model/oauthApps/index.ts +++ b/ui/admin/app/lib/model/oauthApps/index.ts @@ -7,12 +7,12 @@ import { import { AtlassianOAuthApp } from "~/lib/model/oauthApps/providers/atlassian"; import { GitHubOAuthApp } from "~/lib/model/oauthApps/providers/github"; import { GoogleOAuthApp } from "~/lib/model/oauthApps/providers/google"; +import { LinkedInOAuthApp } from "~/lib/model/oauthApps/providers/linkedin"; import { Microsoft365OAuthApp } from "~/lib/model/oauthApps/providers/microsoft365"; import { NotionOAuthApp } from "~/lib/model/oauthApps/providers/notion"; import { SalesforceOAuthApp } from "~/lib/model/oauthApps/providers/salesforce"; import { SlackOAuthApp } from "~/lib/model/oauthApps/providers/slack"; import { ZoomOAuthApp } from "~/lib/model/oauthApps/providers/zoom"; -import { LinkedInOAuthApp } from "~/lib/model/oauthApps/providers/linkedin"; import { EntityMeta } from "~/lib/model/primitives"; export const OAuthAppSpecMap = { From b2ab04eb7488155a1b9c729cbf142fd2f5798521 Mon Sep 17 00:00:00 2001 From: Yingbei Date: Mon, 27 Jan 2025 18:09:54 +0800 Subject: [PATCH 3/6] update linkedin instruction --- .../lib/model/oauthApps/providers/linkedin.ts | 43 ++++++------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts index ee5ba8b7f..fefb5e737 100644 --- a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts +++ b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts @@ -23,50 +23,31 @@ const steps: OAuthFormStep>[] = [ { type: "markdown", text: - "### Step 1: Create a new app in Zoom App Marketplace\n" + + "### Step 1: Create a new app in LinkedIn Developer Portal\n" + "If you already have an app, you can skip to Step 2.\n\n" + - "- Ensure you are logged into your preferred Zoom account.\n" + - "- From the [Zoom App Marketplace](https://marketplace.zoom.us/), hover over the **Develop** box on the top right corner and then select **Build App**.\n" + - "- When asked `What kind of app are you creating?` in the pop-up window, select **General App** and click **Create**.\n" + - "- Now You should be redirected to the **App Basic Information** page.\n" + - "- In the **Select how the app is managed** section, make sure it is set to **User-managed**.\n" + - "- Scroll down to the **Oauth Information** section, copy the url below and paste it into the **OAuth Redirect URL** field.\n", - }, - { - type: "copy", - text: getOAuthLinks("linkedin").redirectURL, - }, - { - type: "markdown", - text: "- Click **Continue** at the bottom and then click **Scopes** on the left sidebar to continue.\n", + "- Ensure you are logged into your preferred LinkedIn account.\n" + + "- From the [LinkedIn Developer Portal](https://developer.linkedin.com), click on **Create app**.\n" + + "- Input required fields: *App Name* and *LinkedIn Page*, and upload an app logo, check the legal aggrement box and click on **Create App**.\n" + + "- Now you should be redirected to the app's settings page.\n", }, { type: "markdown", text: - "### Step 2: Configure the app's necessary scopes\n" + - "- From the [Zoom App Management Page](https://marketplace.zoom.us/user/build), click on the app you created and click **Scopes** on the left sidebar.\n" + + "### Step 2: Configure the app\n" + + "- From the [LinkedIn Developer Portal](https://developer.linkedin.com), click **My Apps** and then select the app you'd like to proceed with.\n" + "(You will already be on this page if you've completed step 1)\n" + - "- Click on **Add Scopes** to add necessary scopes for the zoom tool. Ensure the following scopes are added:\n", + "- Select the **Products** tab and request access for **Share on LinkedIn** and **Sign In with LinkedIn using OpenID Connect**.\n" + + "- Then select the **Auth** tab. In the **OAuth 2.0 settings** section, click on the pencil icon to set the following as redirect URL:\n", }, { - type: "sectionGroup", - sections: [ - { - title: "Scopes: ", - displayStepsInline: true, - defaultOpen: true, - steps: scopes.map((scope) => ({ - type: "copy", - text: scope, - })), - }, - ], + type: "copy", + text: getOAuthLinks("linkedin").redirectURL, }, { type: "markdown", text: "### Step 3: Register your App with Obot\n" + - "- **Client ID** and **Client Secret** can be found in the **App Credentials** box, located at the top of the left sidebar. Alternatively, you can find them in the **App Credentials** section of the **Basic Information** page.\n" + + "- **Client ID** and **Client Secret** can be found in the **Application credentials** box, located at the top of the **Auth** tab page.\n" + "- Copy the **Client ID** and **Client Secret** and paste them into the respective fields below.\n", }, { type: "input", input: "clientID", label: "Client ID" }, From 9a660f35ed764be33ff02c9409468b9e0211517d Mon Sep 17 00:00:00 2001 From: Yingbei Date: Mon, 27 Jan 2025 18:15:35 +0800 Subject: [PATCH 4/6] lint --- ui/admin/app/lib/model/oauthApps/providers/linkedin.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts index fefb5e737..b39a3365d 100644 --- a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts +++ b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts @@ -12,13 +12,6 @@ const schema = z.object({ clientSecret: z.string().min(1, "Client Secret is required"), }); -const scopes = [ - "r_basicprofile", - "r_emailaddress", - "r_liteprofile", - "w_member_social", -]; - const steps: OAuthFormStep>[] = [ { type: "markdown", From 32952d09211cfd1d79bc9ae4be70af986af90be8 Mon Sep 17 00:00:00 2001 From: Yingbei Tong Date: Wed, 29 Jan 2025 00:27:33 +0800 Subject: [PATCH 5/6] Update ui/admin/app/lib/model/oauthApps/providers/linkedin.ts Co-authored-by: Grant Linville --- ui/admin/app/lib/model/oauthApps/providers/linkedin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts index b39a3365d..c1f7d6c15 100644 --- a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts +++ b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts @@ -18,7 +18,7 @@ const steps: OAuthFormStep>[] = [ text: "### Step 1: Create a new app in LinkedIn Developer Portal\n" + "If you already have an app, you can skip to Step 2.\n\n" + - "- Ensure you are logged into your preferred LinkedIn account.\n" + + "- Ensure you are logged in to your preferred LinkedIn account.\n" + "- From the [LinkedIn Developer Portal](https://developer.linkedin.com), click on **Create app**.\n" + "- Input required fields: *App Name* and *LinkedIn Page*, and upload an app logo, check the legal aggrement box and click on **Create App**.\n" + "- Now you should be redirected to the app's settings page.\n", From dd86a6d2f5b7153038f5ab492b9506c35b65ef0f Mon Sep 17 00:00:00 2001 From: Yingbei Tong Date: Wed, 29 Jan 2025 00:27:47 +0800 Subject: [PATCH 6/6] Update ui/admin/app/lib/model/oauthApps/providers/linkedin.ts Co-authored-by: Grant Linville --- ui/admin/app/lib/model/oauthApps/providers/linkedin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts index c1f7d6c15..e5a865cab 100644 --- a/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts +++ b/ui/admin/app/lib/model/oauthApps/providers/linkedin.ts @@ -20,7 +20,7 @@ const steps: OAuthFormStep>[] = [ "If you already have an app, you can skip to Step 2.\n\n" + "- Ensure you are logged in to your preferred LinkedIn account.\n" + "- From the [LinkedIn Developer Portal](https://developer.linkedin.com), click on **Create app**.\n" + - "- Input required fields: *App Name* and *LinkedIn Page*, and upload an app logo, check the legal aggrement box and click on **Create App**.\n" + + "- Input required fields: *App Name* and *LinkedIn Page*, and upload an app logo, check the legal agreement box and click on **Create App**.\n" + "- Now you should be redirected to the app's settings page.\n", }, {