Skip to content
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

Implementation of Oauth of Github, Google and Microsoft #4298

Open
wants to merge 86 commits into
base: master
Choose a base branch
from

Conversation

feyruzb
Copy link
Collaborator

@feyruzb feyruzb commented Jul 18, 2024

fixes #4160

The right way it should look after logging in
Screenshot from 2024-07-18 17-38-29

new added button to log in with github
Screenshot from 2024-07-18 17-40-36

Changes:

  • added new buttons on login page for GitHub,Google Oauth authorization
  • added functions createLink and getOAuthToken into authentication.thrift
  • changed the current version of thrift API from 6.58.0 to 6.59.0
  • imported OAuth2Session in client.py
  • added a case for Oauth authorization in login_user function
  • added definition for thrift
  • imported OAuth2Session in authentication.py
  • added code to load the authentication configuration from
  • added oauth method for authentication in performLogin function
  • added oauth case in session manager
  • added fields for server_config file in the server_config.json
  • added oauth cases in auth.js
  • added reusable providers dict to server config to allow easier adding of new oauth providers
  • create a new function get_oauth_config for getting different providers configs in session manager
  • added documentation for configuration

@feyruzb feyruzb requested review from bruntib and vodorok as code owners July 18, 2024 15:47
@feyruzb feyruzb force-pushed the branch-2-backup branch 2 times, most recently from 5ce7f18 to 68eaf7b Compare July 25, 2024 11:05
@feyruzb feyruzb requested a review from dkrupp as a code owner July 29, 2024 15:14
@feyruzb feyruzb force-pushed the branch-2-backup branch 2 times, most recently from de2e213 to d3f6b29 Compare July 30, 2024 11:02
Copy link
Contributor

@vodorok vodorok left a comment

Choose a reason for hiding this comment

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

Please see my remarks.

I have some additional comments apart from the direct in code messages:

  • My major concern with the implementation is that the oauth related API and its implementation is not generalized enough. The configuration is good enough for the time being.
  • I am not sure if we are allowed to use the Git Hub logo in our repo.
  • Please invite @cservakt to review the JS and VueJS parts.

I did not do a thorough review of the oauth flow in authentication.py after you addressed the above issues I will do another round concentrating on that.

Thanks for the hard work!

web/server/config/server_config.json Outdated Show resolved Hide resolved
web/server/config/server_config.json Show resolved Hide resolved
docs/web/authentication.md Outdated Show resolved Hide resolved
web/api/authentication.thrift Outdated Show resolved Hide resolved
web/client/codechecker_client/client.py Outdated Show resolved Hide resolved
web/server/vue-cli/src/store/actions.type.js Show resolved Hide resolved
web/server/config/server_config.json Outdated Show resolved Hide resolved
web/server/codechecker_server/api/authentication.py Outdated Show resolved Hide resolved
web/server/codechecker_server/session_manager.py Outdated Show resolved Hide resolved
web/server/codechecker_server/session_manager.py Outdated Show resolved Hide resolved
@feyruzb feyruzb force-pushed the branch-2-backup branch 10 times, most recently from 12c68e7 to f064c2b Compare July 31, 2024 14:41
@feyruzb feyruzb requested a review from vodorok July 31, 2024 15:03
@feyruzb feyruzb force-pushed the branch-2-backup branch 3 times, most recently from b4d5a0a to d3847d6 Compare July 31, 2024 16:05
@feyruzb feyruzb force-pushed the branch-2-backup branch 5 times, most recently from 9256875 to 75072a3 Compare October 15, 2024 16:56
with DBSession(self.__config_db) as session:
state_db = session.query(StateCodes) \
.filter(StateCodes.id == state_id) \
.first().state
Copy link
Contributor

Choose a reason for hiding this comment

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

Expired states might not have been purged at this point - add an explicit check here for expires_at.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

fixed

.filter(StateCodes.state == new_state.state
and
StateCodes.expires_at == new_state.expires_at) \
.first().id
Copy link
Contributor

Choose a reason for hiding this comment

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

It might be worthwhile to explicitly store other parameters of the "state" here as well - oauth provider, PKCE if added, etc.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

fixed

Copy link
Contributor

@Discookie Discookie left a comment

Choose a reason for hiding this comment

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

What's the workflow for OAuth authentication via the command-line client? If the user logs in via CodeChecker cmd, and only OAuth providers are enabled, how will they get their CodeChecker session token?

#### OAUTH Configuration options <a name="oauth-configuration-options"></a>
* `enabled`

Indicated if OAUTH authentication is enabled (required for any methods below)
Copy link
Contributor

Choose a reason for hiding this comment

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

Official capitalization is OAuth.

* `oauth_callback_url`

User will be redirected back to the provided link after login with returned data.
It should be constructed in that format `http://codechecker_path/login/OAuthLogin/provider` wher `provider` is the the name of the provider of OAuth and should match existing `provider_name`. The `oauth_callback_url` should also match the callback url specified in the config of your provider on their webpage.
Copy link
Contributor

Choose a reason for hiding this comment

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

If the path of the URL is always the same, wouldn't it make sense to ask for just the domain name? Or at least give a server warning when the path doesn't match the format it should be in.

"oauth_client_id": "client id",
"oauth_client_secret": "client secret",
"oauth_authorization_uri": "https://accounts.google.com/o/oauth2/auth",
"oauth_callback_url": "http://localhost:8080/login/provider",
Copy link
Contributor

Choose a reason for hiding this comment

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

(As an example of where a server warning would be useful, this callback is in the wrong format :D )

codechecker_api_shared.ttypes.ErrorCode.AUTH_DENIED,
"User info fetch failed.")

if provider == "github" and \
Copy link
Contributor

Choose a reason for hiding this comment

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

Are providers case-sensitive?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yes

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

fixed, now whatever the performLogin() gets as provider is being transformed into lowercase

token = None
try:
# code_verifier_db is not supported for github provider
# if it will be fixed the code should adjust automatically
Copy link
Contributor

Choose a reason for hiding this comment

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

This should probably be in the documentation as well, along with how the code fetches Github email addresses instead of just usernames.

"oauth_client_id" : "ExampleClientID",
"oauth_client_secret": "ExampleClientSecret",
"oauth_authorization_uri": "https://github.com/login/oauth/authorize",
"oauth_callback_url": "http://path_To_CodeChecker_Login_Page/provider",
Copy link
Contributor

Choose a reason for hiding this comment

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

This should also follow the correct format.

const baseUrl = window.location.href.replace("#", "");
const baseUrlOAuthId = `${baseUrl}&oauth_data_id=${oauth_data_id}`;
const baseMethod = `${baseUrlOAuthId}&code_challenge_method=${method}`;
const fullUrl = `${baseMethod}&code_challenge=${code_challenge}`;
Copy link
Contributor

Choose a reason for hiding this comment

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

This snippet looks suspect. Why are you reconstructing a URL yourself based on what's in the localStorage, when you are trying to pass the callback URL along as-is? In fact, why are these details stored at all, other than what is strictly necessary?

The stored details in localStorage, and all other variables are checked on the server side, and that is the only check that matters in the chain.

These details in the localStorage also become prone to the same thing that caused the mix-up attack - when someone dispatches a second OAuth login session, and they still didn't finish the first one, these stored details are overwritten.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

fixed, The localStorage is not used anymore, the necessary arguments are stored on server side in database, the oauth_id is removed, the database querying is happening based on state ,

@feyruzb feyruzb force-pushed the branch-2-backup branch 4 times, most recently from 7149ef4 to 1287f13 Compare December 9, 2024 14:05
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.

OpenID Connect based authentication (oauth)
6 participants