Skip to content

Github SSO #191

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 21 commits into from
Nov 19, 2024
Merged

Github SSO #191

merged 21 commits into from
Nov 19, 2024

Conversation

MrSunshyne
Copy link
Member

@MrSunshyne MrSunshyne commented Aug 16, 2024

Summary by CodeRabbit

  • New Features

    • Enhanced authentication with support for multiple providers (Google, GitHub, Discord).
    • Introduced a new GitHub login component for streamlined authentication.
    • Added alert dialog components for improved user interaction during login processes.
  • Bug Fixes

    • Added error handling with user feedback for verification updates.
  • Style

    • Improved formatting and readability across various components.
  • Refactor

    • Updated user data handling to include new properties for better identification.

@MrSunshyne MrSunshyne linked an issue Aug 16, 2024 that may be closed by this pull request
Copy link

cloudflare-workers-and-pages bot commented Aug 16, 2024

Deploying frontend-mu-nuxt with  Cloudflare Pages  Cloudflare Pages

Latest commit: b06ef97
Status: ✅  Deploy successful!
Preview URL: https://a0e02787.frontend-mu-staging.pages.dev
Branch Preview URL: https://163-github-login.frontend-mu-staging.pages.dev

View logs

@MrSunshyne MrSunshyne changed the title enable github button Github SSO Aug 17, 2024
@MrSunshyne MrSunshyne changed the title Github SSO Github SSO [wip Aug 17, 2024
@MrSunshyne MrSunshyne changed the title Github SSO [wip [WIP] Github SSO Aug 17, 2024
@MrSunshyne MrSunshyne changed the title [WIP] Github SSO Github SSO Sep 2, 2024
@n-d-r-d-g
Copy link
Member

TODO: Add error handling on failed GitHub sign in.

Reasons for failure:

  • Email address is not public (in GitHub settings)
  • Other reasons?

Copy link
Contributor

coderabbitai bot commented Oct 9, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

The changes in this pull request enhance the authentication functionality within the Nuxt.js application. The useAuth utility has been updated to support multiple OAuth providers and improved user data handling. The LoggedUser, LoginForm, MyProfile, and RsvpAttendeeList components have received formatting adjustments for better readability and user interface improvements. Additionally, new alert dialog components have been introduced, and the mapToValidUser function along with relevant interfaces have been modified to include new properties for user identification.

Changes

File Path Change Summary
packages/frontendmu-nuxt/auth-utils/useAuth.ts Enhanced useAuth with oAuthLogin supporting multiple providers, updated getCurrentUser fields, modified loginWithSSO, and improved error handling in updateUserVerification.
packages/frontendmu-nuxt/components/auth/LoggedUser.vue Reformatted <template> for clarity, added provider-specific image handling, and standardized transition effects.
packages/frontendmu-nuxt/components/auth/LoginForm.vue Updated oAuthLogin function calls with parameters for 'google' and 'github', and improved input field formatting.
packages/frontendmu-nuxt/components/auth/MyProfile.vue Made formatting adjustments for improved readability without functional changes.
packages/frontendmu-nuxt/components/auth/RsvpAttendeeList.vue Updated logic for rendering profile pictures based on attendee's provider, with standardized class attributes.
packages/frontendmu-nuxt/utils/helpers.ts Modified mapToValidUser for better handling of names and added provider and external_identifier to returned user object.
packages/frontendmu-nuxt/utils/types.ts Updated User and Attendee interfaces to include new optional properties: provider and external_identifier.
packages/frontendmu-nuxt/components/auth/LoginWithGithub.vue Introduced new component for GitHub login, encapsulating the OAuth login logic and UI.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialog.vue Added new alert dialog component for user interactions, utilizing props and emits from the radix-vue library.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogAction.vue Introduced new component for action buttons within alert dialogs, supporting dynamic class bindings.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogCancel.vue Added component for cancel buttons in alert dialogs, with computed properties for class management.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogContent.vue New component for dialog content, managing props and emits effectively.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogDescription.vue Introduced component for dialog descriptions, supporting flexible content insertion.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogFooter.vue Added component for dialog footers, managing layout and styling through props.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogHeader.vue New component for dialog headers, allowing for customizable styling.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogTitle.vue Introduced title component for alert dialogs, supporting dynamic class bindings.
packages/frontendmu-nuxt/components/ui/alert-dialog/AlertDialogTrigger.vue Added trigger component for alert dialogs, facilitating flexible content management.
packages/frontendmu-nuxt/components/ui/alert-dialog/index.ts Exported all alert dialog components for easy import and usage throughout the application.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Auth
    participant Server
    User->>Auth: oAuthLogin(provider)
    Auth->>Server: Request login URL
    Server-->>Auth: Return login URL
    Auth->>User: Redirect to login URL
    User->>Auth: Login success
    Auth->>Server: Fetch current user data
    Server-->>Auth: Return user data (including provider, external_identifier)
    Auth->>User: Display user profile
Loading

🐇 "In the land of code where rabbits play,
New features hop in, brightening the day.
With OAuth support, we leap and bound,
User profiles richer, joy all around!
So let’s celebrate with a cheerful cheer,
For every change brings us closer, my dear!" 🐇


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (6)
packages/frontendmu-nuxt/utils/helpers.ts (2)

39-39: Improved full_name construction looks good!

The use of the nullish coalescing operator enhances the robustness of the full_name construction. This change ensures that even if user.last_name is undefined, the full_name will be properly formatted.

Consider using optional chaining for user.first_name as well, to handle cases where it might be undefined:

const full_name = user?.full_name
  ? user.full_name
  : `${user?.first_name ?? ''} ${user?.last_name ?? ''}`.trim()

This change would make the function more resilient to potential undefined values in the user object.


Line range hint 39-57: Summary: Changes align well with GitHub SSO implementation

The modifications to the mapToValidUser function in this file are well-aligned with the PR's objective of implementing GitHub SSO. The improved full_name construction and the addition of provider and external_identifier properties enhance the function's capability to handle user data from different authentication sources.

As you continue with the SSO implementation:

  1. Ensure consistent error handling across the application for cases where GitHub sign-in might fail.
  2. Consider adding type checks or assertions for the user object to catch potential type mismatches early.
  3. Update relevant interfaces or types to reflect these new properties, ensuring type safety throughout the application.
  4. Document the expected format and source of the provider and external_identifier properties for future maintainability.
packages/frontendmu-nuxt/components/auth/LoggedUser.vue (1)

Line range hint 1-132: Summary: GitHub SSO implementation progresses, but needs error handling enhancements

Overall, the changes in this file successfully implement parts of the GitHub SSO functionality and significantly improve code readability. Key points:

  1. The GitHub avatar handling has been implemented, addressing part of the PR objectives.
  2. UI enhancements, such as the Provider Hint, improve the user experience.
  3. Code formatting changes throughout the file enhance readability and maintainability.

However, to fully meet the PR objectives and ensure robustness:

  1. Implement comprehensive error handling for GitHub sign-in failures, including cases where the user's email is not public.
  2. Add fallback mechanisms for unknown authentication providers in the Provider Hint section.
  3. Ensure all potential avatar sources and provider icons are properly handled to avoid UI inconsistencies.

These enhancements will improve the reliability and user experience of the SSO feature.

Consider implementing a centralized error handling mechanism for authentication-related issues. This could include:

  1. A dedicated error handling service that can be injected into components.
  2. Standardized error messages and UI components for displaying authentication errors.
  3. Logging of authentication errors for monitoring and debugging purposes.

This approach would make it easier to manage and update error handling across the application as new authentication methods are added.

packages/frontendmu-nuxt/components/auth/RsvpAttendeeList.vue (1)

99-105: LGTM! Consider adding error handling for image loading.

The addition of GitHub-specific avatar handling is a good improvement and aligns well with the GitHub SSO implementation. However, to enhance robustness, consider adding error handling for cases where the image fails to load.

Here's a suggestion to add error handling:

<template v-if="attendee.provider === 'github'">
  <img
    :src="`https://github.com/${attendee.external_identifier}.png`"
    :alt="attendee.name"
    @error="handleImageError"
    class="rounded-full mx-auto w-28 h-28 aspect-square"
  >
</template>

Add a method to handle the error:

const handleImageError = (event: Event) => {
  // Fall back to default avatar or show an error message
  (event.target as HTMLImageElement).src = '/path/to/default/avatar.png'
}

This approach ensures a fallback if the GitHub avatar fails to load, improving the user experience.

packages/frontendmu-nuxt/utils/types.ts (1)

39-40: LGTM! Consider adding JSDoc comments for clarity.

The addition of provider and external_identifier properties to the User interface is appropriate for implementing GitHub SSO. These optional properties allow for storing the authentication provider and an external identifier, which is consistent with the PR objectives.

Consider adding JSDoc comments to explain the purpose of these new properties:

/** The authentication provider (e.g., 'github', 'google') */
provider?: string;
/** An identifier provided by the external authentication service */
external_identifier?: string;

This will improve code readability and provide context for other developers.

packages/frontendmu-nuxt/auth-utils/useAuth.ts (1)

Line range hint 105-125: Enhance error handling in 'loginWithSSO' to inform users upon failure

The loginWithSSO function logs errors to the console but doesn't provide feedback to the user when the SSO login fails. Consider displaying an error message using useToast() to improve user experience by informing them of the issue.

Apply this diff to enhance error handling:

        catch (error) {
          console.error('Could not get access token from refresh token')
          console.log(error)
+         useToast().show({
+           title: 'Login Failed',
+           message: 'Unable to log in using Single Sign-On. Please try again or contact support.',
+           type: 'ERROR',
+           visible: true,
+         })
        }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 7056684 and fa83d9f.

📒 Files selected for processing (7)
  • packages/frontendmu-nuxt/auth-utils/useAuth.ts (3 hunks)
  • packages/frontendmu-nuxt/components/auth/LoggedUser.vue (3 hunks)
  • packages/frontendmu-nuxt/components/auth/LoginForm.vue (5 hunks)
  • packages/frontendmu-nuxt/components/auth/MyProfile.vue (8 hunks)
  • packages/frontendmu-nuxt/components/auth/RsvpAttendeeList.vue (1 hunks)
  • packages/frontendmu-nuxt/utils/helpers.ts (2 hunks)
  • packages/frontendmu-nuxt/utils/types.ts (2 hunks)
✅ Files skipped from review due to trivial changes (2)
  • packages/frontendmu-nuxt/components/auth/LoginForm.vue
  • packages/frontendmu-nuxt/components/auth/MyProfile.vue
🧰 Additional context used
🔇 Additional comments (11)
packages/frontendmu-nuxt/utils/helpers.ts (1)

56-57: New properties for GitHub SSO look good, but consider adding error handling.

The addition of provider and external_identifier properties aligns well with the PR's objective of implementing GitHub SSO. These properties will be crucial for identifying users across different authentication methods.

To ensure robustness, consider adding error handling for cases where these properties might be undefined. This aligns with the PR comment about handling GitHub sign-in failures. Here's a script to verify the usage of these new properties throughout the codebase:

This script will help identify where these new properties are used and if there's any existing error handling for them.

packages/frontendmu-nuxt/components/auth/LoggedUser.vue (6)

19-22: Improved button formatting enhances readability

The formatting changes to the BaseButton components improve code readability without altering functionality. This is a positive change that aligns with best practices for template structure in Vue components.

Also applies to: 28-32


37-44: Enhanced menu structure improves code organization

The formatting changes to the logged-in user menu structure improve the overall organization and readability of the template. This change makes the component's structure more clear and maintainable.


83-86: Improved transition component formatting

The formatting changes to the transition component attributes enhance code readability without altering functionality. This change is in line with best practices for maintaining clean and organized templates.


96-97: Enhanced NuxtLink formatting in menu items

The formatting changes to the NuxtLink components within MenuItems improve code readability and maintainability. The proper alignment and line breaks make the template structure more clear without affecting functionality.

Also applies to: 105-106


116-119: Improved avatar image formatting in user profile

The formatting changes to the avatar image display in the user profile section enhance code readability. The proper indentation of the img tag attributes aligns with best practices for template structure.


63-76: Provider Hint enhances UI, consider fallback for unknown providers

The addition of the Provider Hint section is a great UI enhancement, providing users with visual feedback about their authentication method. However, to ensure robustness:

  1. Consider adding a fallback icon for unknown or unsupported providers.
  2. Ensure that the carbon:logo-${user?.provider} icon exists for all supported providers to avoid broken images.

Let's verify the supported providers:

packages/frontendmu-nuxt/components/auth/RsvpAttendeeList.vue (1)

99-111: Overall, good improvements with minor suggestions for enhancement.

The changes effectively implement GitHub-specific avatar handling, which aligns well with the GitHub SSO objective. The standardization of image class attributes improves consistency. Consider implementing the suggested error handling for image loading and verifying the external_identifier usage to further enhance the robustness of this feature.

packages/frontendmu-nuxt/utils/types.ts (1)

39-40: Verify usage of new properties in related components.

The changes to the User and Attendee interfaces are well-aligned with the PR objectives for implementing GitHub SSO. These new properties will allow for better integration with external authentication providers.

To ensure full implementation:

  1. Verify that components handling user authentication and attendee management are updated to use these new properties.
  2. Check if any database schemas or API endpoints need to be updated to accommodate these new fields.
  3. Ensure that the error handling mentioned in the PR description is implemented, particularly for cases where GitHub sign-in fails.

Run the following script to identify potential areas that might need updates:

This will help identify areas of the codebase that might need to be updated to fully utilize the new properties.

Also applies to: 220-221

packages/frontendmu-nuxt/auth-utils/useAuth.ts (2)

117-117: LGTM: Adding 'mode' parameter enhances the SSO login process

The addition of mode: 'cookie' in the request body ensures that the refresh token cookie is correctly sent during the SSO login process.


175-175: Include 'external_identifier' and 'provider' in user data retrieval

Adding 'external_identifier' and 'provider' to ACCOUNT_SETTINGS_FIELDS ensures these fields are included when fetching the current user's data, which is essential for handling multiple OAuth providers.

Also applies to: 180-180

@MrSunshyne MrSunshyne requested a review from n-d-r-d-g November 19, 2024 18:04
@n-d-r-d-g n-d-r-d-g merged commit 0d28ec8 into main Nov 19, 2024
2 of 3 checks passed
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.

Let's implement GitHub login
2 participants