| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | 
							- #
 - #  Copyright 2025 The InfiniFlow Authors. All Rights Reserved.
 - #
 - #  Licensed under the Apache License, Version 2.0 (the "License");
 - #  you may not use this file except in compliance with the License.
 - #  You may obtain a copy of the License at
 - #
 - #      http://www.apache.org/licenses/LICENSE-2.0
 - #
 - #  Unless required by applicable law or agreed to in writing, software
 - #  distributed under the License is distributed on an "AS IS" BASIS,
 - #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 - #  See the License for the specific language governing permissions and
 - #  limitations under the License.
 - #
 - 
 - import requests
 - from .oauth import OAuthClient, UserInfo
 - 
 - 
 - class GithubOAuthClient(OAuthClient):
 -     def __init__(self, config):
 -         """
 -         Initialize the GithubOAuthClient with the provider's configuration.
 -         """
 -         config.update({
 -             "authorization_url": "https://github.com/login/oauth/authorize",
 -             "token_url": "https://github.com/login/oauth/access_token",
 -             "userinfo_url": "https://api.github.com/user",
 -             "scope": "user:email"
 -         })
 -         super().__init__(config)
 - 
 - 
 -     def fetch_user_info(self, access_token, **kwargs):
 -         """
 -         Fetch github user info.
 -         """
 -         user_info = {}
 -         try:
 -             headers = {"Authorization": f"Bearer {access_token}"}
 -             # user info
 -             response = requests.get(self.userinfo_url, headers=headers, timeout=self.http_request_timeout)
 -             response.raise_for_status()
 -             user_info.update(response.json())
 -             # email info
 -             response = requests.get(self.userinfo_url+"/emails", headers=headers, timeout=self.http_request_timeout)
 -             response.raise_for_status()
 -             email_info = response.json()
 -             user_info["email"] = next(
 -                 (email for email in email_info if email["primary"]), None
 -             )["email"]
 -             return self.normalize_user_info(user_info)
 -         except requests.exceptions.RequestException as e:
 -             raise ValueError(f"Failed to fetch github user info: {e}")
 - 
 - 
 -     def normalize_user_info(self, user_info):
 -         email = user_info.get("email")
 -         username = user_info.get("login", str(email).split("@")[0])
 -         nickname = user_info.get("name", username)
 -         avatar_url = user_info.get("avatar_url", "")
 -         return UserInfo(email=email, username=username, nickname=nickname, avatar_url=avatar_url)
 
 
  |