Skip to content

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

Open
Twixes wants to merge 16 commits intomasterfrom
posthog-code/inbox-github-connection-banner
Open

feat(auth): Allow users to attach GH profile via social auth#53767
Twixes wants to merge 16 commits intomasterfrom
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.


Created with PostHog Code

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

🎭 Playwright report · View test results →

⚠️ 3 flaky tests:

  • Logout in another tab results in logout in the current tab too (chromium)
  • Deleting an insight from dashboard redirects back (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.53 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.3 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.21 kB -50 B (-3.97%)
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.9 kB 0 B
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 0 B
frontend/dist/Experiments 17.7 kB 0 B
frontend/dist/exporter 20.9 MB +253 B (0%)
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 572 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 6.03 kB 0 B
frontend/dist/HeatmapsScene 3.88 kB 0 B
frontend/dist/hls 394 kB 0 B
frontend/dist/HogFunctionScene 59.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 0 B
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 116 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.13 kB 0 B
frontend/dist/NotebookPanel 5.14 kB 0 B
frontend/dist/NotebookScene 8.14 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 682 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 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 1.59 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.5 MB +253 B (0%)
frontend/dist/render-query.js 20.5 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 kB 0 B
frontend/dist/SupportTicketsScene 733 B 0 B
frontend/dist/Survey 780 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 -12 B (-0.02%)
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 20.1 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.3 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.6 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 103 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 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.

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

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


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 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 and others added 12 commits April 10, 2026 16:26
…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
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
@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.

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