Skip to content

feat(auth): Allow users to attach GH profile via social auth#53767

Merged
Twixes merged 17 commits into
masterfrom
posthog-code/inbox-github-connection-banner
Apr 13, 2026
Merged

feat(auth): Allow users to attach GH profile via social auth#53767
Twixes merged 17 commits into
masterfrom
posthog-code/inbox-github-connection-banner

Conversation

@Twixes
Copy link
Copy Markdown
Member

@Twixes Twixes commented Apr 8, 2026

Problem

PostHog needs to know a mapping of PostHog user to GH user, which we can do via social auth.

Changes

Addsig github_login read-only field to UserSerializer, returning the GitHub username from UserSocialAuth (or null). Then, allowing authenticated users to link social auth accounts via /login/<backend>/ by skipping session flush when already logged in. This preserves password when linking a social account to an existing authenticated user (previously wiped for unverified emails). Also, adding a new scene to neatly tell the user to go back to PH Code.

EDIT: This now also reuses the info on who was the user adding the GitHub integration on the project, BUT that requires two new env vars: GITHUB_APP_OAUTH_CLIENT_IDand GITHUB_APP_OAUTH_CLIENT_SECRET.


Created with PostHog Code

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

🎭 Playwright report · View test results →

⚠️ 2 flaky tests:

  • Logout in another tab results in logout in the current tab too (chromium)
  • Materialize view pane (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this comment? Help fix flakies and failures and it'll disappear!

@tests-posthog
Copy link
Copy Markdown
Contributor

tests-posthog Bot commented Apr 8, 2026

Query snapshots: Backend query snapshots updated

Changes: 1 snapshots (1 modified, 0 added, 0 deleted)

What this means:

  • Query snapshots have been automatically updated to match current output
  • These changes reflect modifications to database queries or schema

Next steps:

  • Review the query changes to ensure they're intentional
  • If unexpected, investigate what caused the query to change

Review snapshot changes →

@Twixes Twixes force-pushed the posthog-code/inbox-github-connection-banner branch from 4905a00 to f070d6d Compare April 9, 2026 09:58
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

Size Change: +1.17 kB (0%)

Total Size: 129 MB

ℹ️ View Unchanged
Filename Size Change
frontend/dist/368Hedgehogs 5.26 kB 0 B
frontend/dist/abap 14.2 kB 0 B
frontend/dist/AccountSocialConnected 1.62 kB 0 B
frontend/dist/Action 23.2 kB 0 B
frontend/dist/Actions 1.02 kB 0 B
frontend/dist/AdvancedActivityLogsScene 34 kB 0 B
frontend/dist/AgenticAuthorize 5.25 kB 0 B
frontend/dist/apex 3.95 kB 0 B
frontend/dist/ApprovalDetail 16.2 kB 0 B
frontend/dist/array.full.es5.js 327 kB 0 B
frontend/dist/array.full.js 423 kB 0 B
frontend/dist/array.js 178 kB 0 B
frontend/dist/AsyncMigrations 13.1 kB 0 B
frontend/dist/AuthorizationStatus 716 B 0 B
frontend/dist/azcli 846 B 0 B
frontend/dist/bat 1.84 kB 0 B
frontend/dist/BatchExportScene 60.3 kB 0 B
frontend/dist/bicep 2.55 kB 0 B
frontend/dist/Billing 493 B 0 B
frontend/dist/BillingSection 20.8 kB 0 B
frontend/dist/BoxPlot 5.04 kB 0 B
frontend/dist/browserAll-0QZMN1W2 37.4 kB 0 B
frontend/dist/ButtonPrimitives 562 B 0 B
frontend/dist/CalendarHeatMap 4.79 kB 0 B
frontend/dist/cameligo 2.18 kB 0 B
frontend/dist/changeRequestsLogic 544 B 0 B
frontend/dist/CLIAuthorize 11.3 kB 0 B
frontend/dist/CLILive 3.97 kB 0 B
frontend/dist/clojure 9.64 kB 0 B
frontend/dist/coffee 3.59 kB 0 B
frontend/dist/Cohort 23.2 kB 0 B
frontend/dist/CohortCalculationHistory 6.22 kB 0 B
frontend/dist/Cohorts 9.39 kB 0 B
frontend/dist/ConfirmOrganization 4.48 kB 0 B
frontend/dist/conversations.js 65.8 kB 0 B
frontend/dist/Coupons 720 B 0 B
frontend/dist/cpp 5.3 kB 0 B
frontend/dist/Create 829 B 0 B
frontend/dist/crisp-chat-integration.js 1.88 kB 0 B
frontend/dist/csharp 4.52 kB 0 B
frontend/dist/csp 1.42 kB 0 B
frontend/dist/css 4.51 kB 0 B
frontend/dist/cssMode 4.15 kB 0 B
frontend/dist/CustomCssScene 3.55 kB 0 B
frontend/dist/CustomerAnalyticsConfigurationScene 1.99 kB 0 B
frontend/dist/CustomerAnalyticsScene 26.4 kB 0 B
frontend/dist/CustomerJourneyBuilderScene 1.69 kB 0 B
frontend/dist/CustomerJourneyTemplatesScene 7.39 kB 0 B
frontend/dist/customizations.full.js 17.9 kB 0 B
frontend/dist/CyclotronJobInputAssignee 1.32 kB 0 B
frontend/dist/CyclotronJobInputTicketTags 711 B 0 B
frontend/dist/cypher 3.38 kB 0 B
frontend/dist/dart 4.25 kB 0 B
frontend/dist/Dashboard 1.11 kB 0 B
frontend/dist/Dashboards 23.1 kB 0 B
frontend/dist/DataManagementScene 646 B 0 B
frontend/dist/DataPipelinesNewScene 2.28 kB 0 B
frontend/dist/DataWarehouseScene 1.26 kB 0 B
frontend/dist/DataWarehouseSourceScene 634 B 0 B
frontend/dist/Deactivated 1.13 kB 0 B
frontend/dist/dead-clicks-autocapture.js 13.1 kB 0 B
frontend/dist/DeadLetterQueue 5.38 kB 0 B
frontend/dist/DebugScene 20 kB 0 B
frontend/dist/decompressionWorker 2.85 kB 0 B
frontend/dist/decompressionWorker.js 2.85 kB 0 B
frontend/dist/DefinitionEdit 7.11 kB 0 B
frontend/dist/DefinitionView 22.7 kB 0 B
frontend/dist/DestinationsScene 2.67 kB 0 B
frontend/dist/dist 575 B 0 B
frontend/dist/dockerfile 1.87 kB 0 B
frontend/dist/EarlyAccessFeature 753 B 0 B
frontend/dist/EarlyAccessFeatures 2.84 kB 0 B
frontend/dist/ecl 5.33 kB 0 B
frontend/dist/EditorScene 896 B 0 B
frontend/dist/elixir 10.3 kB 0 B
frontend/dist/elk.bundled 1.44 MB 0 B
frontend/dist/EmailMFAVerify 2.98 kB 0 B
frontend/dist/EndpointScene 37.5 kB 0 B
frontend/dist/EndpointsScene 22.1 kB 0 B
frontend/dist/ErrorTrackingConfigurationScene 2.2 kB 0 B
frontend/dist/ErrorTrackingIssueFingerprintsScene 6.98 kB 0 B
frontend/dist/ErrorTrackingIssueScene 81.7 kB -6 B (-0.01%)
frontend/dist/ErrorTrackingScene 12.9 kB 0 B
frontend/dist/EvaluationTemplates 575 B 0 B
frontend/dist/EventsScene 2.46 kB 0 B
frontend/dist/exception-autocapture.js 11.8 kB 0 B
frontend/dist/Experiment 208 kB +6 B (0%)
frontend/dist/Experiments 17.7 kB 0 B
frontend/dist/exporter 20.9 MB 0 B
frontend/dist/exporter.js 20.9 MB +253 B (0%)
frontend/dist/ExportsScene 3.86 kB 0 B
frontend/dist/FeatureFlag 128 kB 0 B
frontend/dist/FeatureFlags 606 B 0 B
frontend/dist/FeatureFlagTemplatesScene 7.03 kB 0 B
frontend/dist/FlappyHog 5.78 kB 0 B
frontend/dist/flow9 1.8 kB 0 B
frontend/dist/freemarker2 16.7 kB 0 B
frontend/dist/fsharp 2.98 kB 0 B
frontend/dist/go 2.65 kB 0 B
frontend/dist/graphql 2.26 kB 0 B
frontend/dist/Group 14.4 kB 0 B
frontend/dist/Groups 3.91 kB 0 B
frontend/dist/GroupsNew 7.34 kB 0 B
frontend/dist/handlebars 7.34 kB 0 B
frontend/dist/hcl 3.59 kB 0 B
frontend/dist/HealthCategoryDetailScene 7.23 kB 0 B
frontend/dist/HealthScene 10.3 kB 0 B
frontend/dist/HeatmapNewScene 4.16 kB 0 B
frontend/dist/HeatmapRecordingScene 3.92 kB 0 B
frontend/dist/HeatmapScene 5.88 kB 0 B
frontend/dist/HeatmapsScene 3.88 kB 0 B
frontend/dist/hls 394 kB 0 B
frontend/dist/HogFunctionScene 58.7 kB 0 B
frontend/dist/HogRepl 7.37 kB 0 B
frontend/dist/html 5.58 kB 0 B
frontend/dist/htmlMode 4.62 kB 0 B
frontend/dist/image-blob-reduce.esm 49.4 kB 0 B
frontend/dist/InboxScene 59.7 kB 0 B
frontend/dist/index 308 kB +80 B (+0.03%)
frontend/dist/index.js 308 kB +80 B (+0.03%)
frontend/dist/ini 1.1 kB 0 B
frontend/dist/InsightOptions 5.41 kB 0 B
frontend/dist/InsightScene 28.9 kB 0 B
frontend/dist/IntegrationsRedirect 733 B 0 B
frontend/dist/intercom-integration.js 1.93 kB 0 B
frontend/dist/InviteSignup 14.4 kB 0 B
frontend/dist/java 3.22 kB 0 B
frontend/dist/javascript 985 B 0 B
frontend/dist/jsonMode 13.9 kB 0 B
frontend/dist/julia 7.22 kB 0 B
frontend/dist/kotlin 3.4 kB 0 B
frontend/dist/lazy 150 kB 0 B
frontend/dist/LegacyPluginScene 26.6 kB 0 B
frontend/dist/LemonTextAreaMarkdown 502 B 0 B
frontend/dist/less 3.9 kB 0 B
frontend/dist/lexon 2.44 kB 0 B
frontend/dist/lib 2.22 kB 0 B
frontend/dist/Link 468 B 0 B
frontend/dist/LinkScene 24.8 kB 0 B
frontend/dist/LinksScene 4.19 kB 0 B
frontend/dist/liquid 4.53 kB 0 B
frontend/dist/LiveDebugger 19.1 kB 0 B
frontend/dist/LiveEventsTable 2.98 kB 0 B
frontend/dist/LLMAnalyticsClusterScene 15.7 kB 0 B
frontend/dist/LLMAnalyticsClustersScene 43.1 kB 0 B
frontend/dist/LLMAnalyticsDatasetScene 19.7 kB 0 B
frontend/dist/LLMAnalyticsDatasetsScene 3.28 kB 0 B
frontend/dist/LLMAnalyticsEvaluation 41.7 kB 0 B
frontend/dist/LLMAnalyticsEvaluationsScene 29.5 kB 0 B
frontend/dist/LLMAnalyticsPlaygroundScene 36.3 kB 0 B
frontend/dist/LLMAnalyticsScene 117 kB 0 B
frontend/dist/LLMAnalyticsSessionScene 13.4 kB 0 B
frontend/dist/LLMAnalyticsTraceScene 127 kB 0 B
frontend/dist/LLMAnalyticsUsers 526 B 0 B
frontend/dist/LLMASessionFeedbackDisplay 4.83 kB 0 B
frontend/dist/LLMPromptScene 20.6 kB 0 B
frontend/dist/LLMPromptsScene 4.21 kB 0 B
frontend/dist/Login 8.57 kB 0 B
frontend/dist/Login2FA 4.2 kB 0 B
frontend/dist/logs.js 38.5 kB 0 B
frontend/dist/LogsScene 11.3 kB 0 B
frontend/dist/lua 2.11 kB 0 B
frontend/dist/m3 2.81 kB 0 B
frontend/dist/main 819 kB 0 B
frontend/dist/ManagedMigration 14 kB 0 B
frontend/dist/markdown 3.79 kB 0 B
frontend/dist/MarketingAnalyticsScene 39.7 kB 0 B
frontend/dist/MaterializedColumns 10.2 kB 0 B
frontend/dist/Max 835 B 0 B
frontend/dist/mdx 5.39 kB 0 B
frontend/dist/memlens.lib.bundle 27.8 kB 0 B
frontend/dist/MessageTemplate 16.3 kB 0 B
frontend/dist/MetricsScene 828 B 0 B
frontend/dist/mips 2.58 kB 0 B
frontend/dist/ModelsScene 13.6 kB 0 B
frontend/dist/MonacoDiffEditor 403 B 0 B
frontend/dist/monacoEditorWorker 288 kB 0 B
frontend/dist/monacoEditorWorker.js 288 kB 0 B
frontend/dist/monacoJsonWorker 419 kB 0 B
frontend/dist/monacoJsonWorker.js 419 kB 0 B
frontend/dist/monacoTsWorker 7.02 MB 0 B
frontend/dist/monacoTsWorker.js 7.02 MB 0 B
frontend/dist/MoveToPostHogCloud 4.46 kB 0 B
frontend/dist/msdax 4.91 kB 0 B
frontend/dist/mysql 11.3 kB 0 B
frontend/dist/NavTabChat 4.68 kB 0 B
frontend/dist/NewSourceWizard 724 B 0 B
frontend/dist/NewTabScene 681 B 0 B
frontend/dist/NodeDetailScene 16.3 kB 0 B
frontend/dist/NotebookCanvasScene 3.2 kB 0 B
frontend/dist/NotebookPanel 5.21 kB 0 B
frontend/dist/NotebookScene 8.21 kB 0 B
frontend/dist/NotebooksScene 7.58 kB 0 B
frontend/dist/OAuthAuthorize 573 B 0 B
frontend/dist/objective-c 2.41 kB 0 B
frontend/dist/Onboarding 687 kB 0 B
frontend/dist/OnboardingCouponRedemption 1.2 kB 0 B
frontend/dist/pascal 2.99 kB 0 B
frontend/dist/pascaligo 2 kB 0 B
frontend/dist/passkeyLogic 484 B 0 B
frontend/dist/PasswordReset 4.32 kB 0 B
frontend/dist/PasswordResetComplete 2.94 kB 0 B
frontend/dist/perl 8.25 kB 0 B
frontend/dist/PersonScene 16.1 kB 0 B
frontend/dist/PersonsScene 4.68 kB 0 B
frontend/dist/pgsql 13.5 kB 0 B
frontend/dist/php 8.02 kB 0 B
frontend/dist/PipelineStatusScene 6.22 kB 0 B
frontend/dist/pla 1.67 kB 0 B
frontend/dist/posthog 136 kB 0 B
frontend/dist/postiats 7.86 kB 0 B
frontend/dist/powerquery 16.9 kB 0 B
frontend/dist/powershell 3.27 kB 0 B
frontend/dist/PreflightCheck 5.53 kB 0 B
frontend/dist/product-tours.js 115 kB 0 B
frontend/dist/ProductTour 273 kB 0 B
frontend/dist/ProductTours 4.68 kB 0 B
frontend/dist/ProjectHomepage 24.7 kB 0 B
frontend/dist/protobuf 9.05 kB 0 B
frontend/dist/pug 4.82 kB 0 B
frontend/dist/python 4.76 kB 0 B
frontend/dist/qsharp 3.19 kB 0 B
frontend/dist/QueryPerformance 3.44 kB 0 B
frontend/dist/r 3.12 kB 0 B
frontend/dist/razor 9.35 kB 0 B
frontend/dist/recorder-v2.js 111 kB 0 B
frontend/dist/recorder.js 111 kB 0 B
frontend/dist/redis 3.55 kB 0 B
frontend/dist/redshift 11.8 kB 0 B
frontend/dist/RegionMap 29.4 kB 0 B
frontend/dist/render-query 20.6 MB 0 B
frontend/dist/render-query.js 20.6 MB +253 B (0%)
frontend/dist/ResourceTransfer 9.17 kB 0 B
frontend/dist/restructuredtext 3.9 kB 0 B
frontend/dist/RevenueAnalyticsScene 25.6 kB 0 B
frontend/dist/ruby 8.5 kB 0 B
frontend/dist/rust 4.16 kB 0 B
frontend/dist/SavedInsights 664 B 0 B
frontend/dist/sb 1.82 kB 0 B
frontend/dist/scala 7.32 kB 0 B
frontend/dist/scheme 1.76 kB 0 B
frontend/dist/scss 6.41 kB 0 B
frontend/dist/SdkDoctorScene 9.4 kB 0 B
frontend/dist/SessionAttributionExplorerScene 6.62 kB 0 B
frontend/dist/SessionGroupSummariesTable 4.62 kB 0 B
frontend/dist/SessionGroupSummaryScene 17 kB 0 B
frontend/dist/SessionProfileScene 15.8 kB 0 B
frontend/dist/SessionRecordingDetail 1.73 kB 0 B
frontend/dist/SessionRecordingFilePlaybackScene 4.46 kB 0 B
frontend/dist/SessionRecordings 742 B 0 B
frontend/dist/SessionRecordingsKiosk 8.84 kB 0 B
frontend/dist/SessionRecordingsPlaylistScene 4.14 kB 0 B
frontend/dist/SessionRecordingsSettingsScene 1.9 kB 0 B
frontend/dist/SessionsScene 3.86 kB 0 B
frontend/dist/SettingsScene 2.98 kB 0 B
frontend/dist/SharedMetric 4.83 kB 0 B
frontend/dist/SharedMetrics 549 B 0 B
frontend/dist/shell 3.07 kB 0 B
frontend/dist/SignupContainer 24.5 kB 0 B
frontend/dist/Site 1.18 kB 0 B
frontend/dist/solidity 18.6 kB 0 B
frontend/dist/sophia 2.76 kB 0 B
frontend/dist/SourcesScene 5.96 kB 0 B
frontend/dist/sourceWizardLogic 662 B 0 B
frontend/dist/sparql 2.55 kB 0 B
frontend/dist/sql 10.3 kB 0 B
frontend/dist/SqlVariableEditScene 7.24 kB 0 B
frontend/dist/st 7.4 kB 0 B
frontend/dist/StartupProgram 21.2 kB 0 B
frontend/dist/SubscriptionsScene 16.4 kB 0 B
frontend/dist/SupportSettingsScene 1.16 kB 0 B
frontend/dist/SupportTicketScene 23.4 kB 0 B
frontend/dist/SupportTicketsScene 733 B 0 B
frontend/dist/Survey 848 B 0 B
frontend/dist/SurveyFormBuilder 1.54 kB 0 B
frontend/dist/Surveys 18.2 kB 0 B
frontend/dist/surveys.js 90 kB 0 B
frontend/dist/SurveyWizard 64.2 kB 0 B
frontend/dist/swift 5.26 kB 0 B
frontend/dist/SystemStatus 16.8 kB 0 B
frontend/dist/systemverilog 7.61 kB 0 B
frontend/dist/TaskDetailScene 21.5 kB 0 B
frontend/dist/TaskTracker 13.2 kB 0 B
frontend/dist/tcl 3.57 kB 0 B
frontend/dist/TextCardMarkdownEditor 11 kB 0 B
frontend/dist/toolbar 10.6 MB +252 B (0%)
frontend/dist/toolbar.js 10.6 MB +252 B (0%)
frontend/dist/ToolbarLaunch 2.52 kB 0 B
frontend/dist/tracing-headers.js 1.74 kB 0 B
frontend/dist/TracingScene 29.4 kB 0 B
frontend/dist/TransformationsScene 1.91 kB 0 B
frontend/dist/tsMode 24 kB 0 B
frontend/dist/twig 5.97 kB 0 B
frontend/dist/TwoFactorReset 3.98 kB 0 B
frontend/dist/typescript 240 B 0 B
frontend/dist/typespec 2.82 kB 0 B
frontend/dist/Unsubscribe 1.62 kB 0 B
frontend/dist/UserInterview 4.53 kB 0 B
frontend/dist/UserInterviews 2.01 kB 0 B
frontend/dist/vb 5.79 kB 0 B
frontend/dist/VercelConnect 4.95 kB 0 B
frontend/dist/VercelLinkError 1.91 kB 0 B
frontend/dist/VerifyEmail 4.48 kB 0 B
frontend/dist/vimMode 211 kB 0 B
frontend/dist/VisualReviewRunScene 18.6 kB 0 B
frontend/dist/VisualReviewRunsScene 6.16 kB 0 B
frontend/dist/VisualReviewSettingsScene 10.8 kB 0 B
frontend/dist/web-vitals.js 6.39 kB 0 B
frontend/dist/WebAnalyticsScene 5.77 kB 0 B
frontend/dist/WebGLRenderer-DYjOwNoG 60.3 kB 0 B
frontend/dist/WebGPURenderer-B_wkl_Ja 36.3 kB 0 B
frontend/dist/WebScriptsScene 2.54 kB 0 B
frontend/dist/webworkerAll-puPV1rBA 324 B 0 B
frontend/dist/wgsl 7.34 kB 0 B
frontend/dist/Wizard 4.45 kB 0 B
frontend/dist/WorkflowScene 102 kB 0 B
frontend/dist/WorkflowsScene 46.9 kB 0 B
frontend/dist/WorldMap 4.73 kB 0 B
frontend/dist/xml 2.98 kB 0 B
frontend/dist/yaml 4.6 kB 0 B

compressed-size-action

@Twixes Twixes force-pushed the posthog-code/inbox-github-connection-banner branch from a9e240c to bc1f374 Compare April 9, 2026 14:47
@Twixes Twixes marked this pull request as ready for review April 9, 2026 14:47
@Twixes Twixes requested a review from a team as a code owner April 9, 2026 14:47
@Twixes Twixes changed the title feat(api): Expose github_login on user API and support social auth linking feat(auth): Allow users to attach GH profile via social auth Apr 9, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 9, 2026

Vulnerabilities

No security concerns identified. The connect_from query parameter is user-controlled but is only used to select a hardcoded copy string in the frontend and is always URL-encoded before inclusion in the next redirect target — it cannot act as an open-redirect vector. The next URL produced by _account_social_connected_next_url is always relative (/account/social-connected?…), keeping redirects on the same origin. The github_login field is read-only and exposed only on the authenticated /api/users/@me/ endpoint (or to staff), so it does not leak data to unauthenticated callers.

Prompt To Fix All With AI
This is a comment left during a code review.
Path: posthog/api/signup.py
Line: 796

Comment:
**Inaccurate log message after condition widening**

The log key `social_create_user_is_not_new_unverified_has_password` is now emitted whenever `not user.is_email_verified`, including the new case where the user has no password (`user.password is None`). Before this PR, the outer guard was `if not user.is_email_verified and user.password is not None`, so the message only appeared when a password was actually set. Consider renaming the log key to match the actual condition.

```suggestion
            logger.info(f"social_create_user_is_not_new_unverified")
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "Add new "Account connected" view" | Re-trigger Greptile

Comment thread posthog/api/signup.py
Comment on lines 146 to -140
def sso_login(request: HttpRequest, backend: str) -> HttpResponse:
request.session.flush()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I understand correctly, redirecting to /login/<backend>/ now silently links the social provider to the existing user. This is a pretty big behavior change with side effects from just visiting/being redirected to a GET url. We should show the user an explicit confirmation page, like we do during OAuth connection for ex, so that they can confirm this action.

Copy link
Copy Markdown
Member Author

@Twixes Twixes Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, we should still flush by default.
For the PH Code linking case, I don't think we should have an extra confirmation screen though. But this is simple - we can only do the "link social auth provider to the existing, currently-logged-in PostHog user" thing when the connect_from arg is set.
Implemented this change, so there is no blast radius here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, we should still flush by default.
For the PH Code linking case, I don't think we should have an extra confirmation screen though.

Can you tell me more about this case? IMO we should have an explicit confirmation dialog whenever linking a third party to an existing account.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pinged you in Slack which already has a bit of that context :)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Discussed offline - the account linking will have already occurred by this point. We should still show an explicit confirmation dialog, but that's out of scope of this change.

Comment thread posthog/api/signup.py Outdated
logger.info(f"social_create_user_is_not_new")

if not user.is_email_verified and user.password is not None:
if not user.is_email_verified:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It feels kinda fishy, as the social email of the user could differ from their PostHog email, but I assume if they are already authentificated it's alright.

Is it technically possible for me to create an account with bill.gates@posthog.com, and then add my GitHub, so my email will be marked confirmed? :)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this part is not needed or good here. I think this was left over from a slightly different approach earlier. Reverted

Comment thread posthog/api/user.py Outdated
def get_github_login(self, instance: User) -> Optional[str]:
# Use all() to hit the prefetch cache from get_queryset; filter in Python
for sa in instance.social_auth.all():
if sa.provider == "github" and isinstance(sa.extra_data, dict):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can't have more than one GitHub sync, right? Like, technically we can, in the DB, but not practically?

Copy link
Copy Markdown
Member Author

@Twixes Twixes Apr 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, there's no user flow to do that. I think if you do through the GH login route with the PH Code-only connect_from param twice with two different GitHub accounts, this can technically result in two GH accounts being connected. But there isn't really a way to get into that situation, and it's not a problem, that works because it's natively supported by django-social-auth

Comment thread posthog/api/user.py Outdated

def get_github_login(self, instance: User) -> Optional[str]:
# Use all() to hit the prefetch cache from get_queryset; filter in Python
for sa in instance.social_auth.all():
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: UserSocialAuth.objects.filter(user_id="bla-bla", provider='github').values_list('extra_data__login', flat=True).first() to avoid getting blobs if we need only login?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, great point, this should be at the prefetch level. Narrowed that down

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now with the change I described in PostHog/code#1561, we're now also fetching Integration to determine github_login - so moved this altogether to its own GET action on the user, as we only need this in PH Code

@Twixes Twixes force-pushed the posthog-code/inbox-github-connection-banner branch from b3c72c1 to c281b2f Compare April 9, 2026 19:25
Comment thread posthog/api/authentication.py Outdated
Comment thread posthog/api/user.py Outdated
Comment thread posthog/models/user.py Outdated
Comment on lines 146 to -140
def sso_login(request: HttpRequest, backend: str) -> HttpResponse:
request.session.flush()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Discussed offline - the account linking will have already occurred by this point. We should still show an explicit confirmation dialog, but that's out of scope of this change.

@github-actions
Copy link
Copy Markdown
Contributor

MCP UI Apps size report

App JS CSS
debug 545.4 KB 23.6 KB
action 530.1 KB 23.6 KB
action-list 536.2 KB 23.6 KB
cohort 529.2 KB 23.6 KB
cohort-list 535.2 KB 23.6 KB
error-details 538.1 KB 23.6 KB
error-issue 529.8 KB 23.6 KB
error-issue-list 536.1 KB 23.6 KB
experiment 533.5 KB 23.6 KB
experiment-list 536.9 KB 23.6 KB
experiment-results 533.1 KB 23.6 KB
feature-flag 534.0 KB 23.6 KB
feature-flag-list 540.6 KB 23.6 KB
llm-costs 534.9 KB 23.6 KB
survey 530.8 KB 23.6 KB
survey-global-stats 532.4 KB 23.6 KB
survey-list 536.9 KB 23.6 KB
survey-stats 532.4 KB 23.6 KB
workflow 529.6 KB 23.6 KB
workflow-list 535.6 KB 23.6 KB
query-results 543.6 KB 23.6 KB

@Twixes Twixes force-pushed the posthog-code/inbox-github-connection-banner branch from bb0d453 to 6c4738c Compare April 10, 2026 14:28
Copy link
Copy Markdown
Member Author

Twixes commented Apr 10, 2026

This stack of pull requests is managed by Graphite. Learn more about stacking.

@Twixes Twixes force-pushed the posthog-code/inbox-github-connection-banner branch 2 times, most recently from 36b2bc9 to 7c83df7 Compare April 13, 2026 09:53
Twixes and others added 8 commits April 13, 2026 18:28
…nking

- Add `github_login` field to UserSerializer, returning the GitHub
  username from UserSocialAuth (or null).
- Allow authenticated users to link social auth accounts via /login/<backend>/
  by skipping session flush when already logged in.
- Preserve password when linking a social account to an existing
  authenticated user (previously wiped for unverified emails).

Generated-By: PostHog Code
Task-Id: 3089dc72-e26f-4715-8999-1a194fc7030c
@Twixes Twixes force-pushed the posthog-code/inbox-github-connection-banner branch from 7c83df7 to 7ab0d12 Compare April 13, 2026 16:31
@tests-posthog
Copy link
Copy Markdown
Contributor

tests-posthog Bot commented Apr 13, 2026

Query snapshots: Backend query snapshots updated

Changes: 1 snapshots (1 modified, 0 added, 0 deleted)

What this means:

  • Query snapshots have been automatically updated to match current output
  • These changes reflect modifications to database queries or schema

Next steps:

  • Review the query changes to ensure they're intentional
  • If unexpected, investigate what caused the query to change

Review snapshot changes →

@Twixes Twixes merged commit ad5a3ee into master Apr 13, 2026
223 checks passed
Copy link
Copy Markdown
Member Author

Twixes commented Apr 13, 2026

Merge activity

@Twixes Twixes deleted the posthog-code/inbox-github-connection-banner branch April 13, 2026 17:20
Twixes added a commit to PostHog/code that referenced this pull request Apr 13, 2026
## Summary

Adds a floating banner at the bottom of the inbox report list pane showing GitHub connection status. The button links to `/login/github/` to start the OAuth linking flow & refetches user data when the app window regains focus.

Companion backend PR: PostHog/posthog#53767

---
*Created with [PostHog Code](https://posthog.com/code?ref=pr)*
@deployment-status-posthog
Copy link
Copy Markdown

deployment-status-posthog Bot commented Apr 13, 2026

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-04-13 17:45 UTC Run
prod-us ⏳ Pending
prod-eu ✅ Deployed 2026-04-13 19:00 UTC Run

Twixes added a commit that referenced this pull request Apr 21, 2026
## Problem

Unknowingly duplicated `GITHUB_APP_CLIENT_ID` as `GITHUB_APP_OAUTH_CLIENT_ID` in  #53767.

## Changes

`GITHUB_APP_OAUTH_CLIENT_ID` →  the pre-existing `GITHUB_APP_CLIENT_ID`
`GITHUB_APP_OAUTH_CLIENT_SECRET` → just `GITHUB_APP_CLIENT_SECRET`

Companion: PostHog/charts#9900
thmsobrmlr pushed a commit that referenced this pull request Apr 21, 2026
## Problem

Unknowingly duplicated `GITHUB_APP_CLIENT_ID` as `GITHUB_APP_OAUTH_CLIENT_ID` in  #53767.

## Changes

`GITHUB_APP_OAUTH_CLIENT_ID` →  the pre-existing `GITHUB_APP_CLIENT_ID`
`GITHUB_APP_OAUTH_CLIENT_SECRET` → just `GITHUB_APP_CLIENT_SECRET`

Companion: PostHog/charts#9900
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants