рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдВ

рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн ultralytics/hub/auth.py

рдиреЛрдЯ

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ https://github.com/ultralytics/ultralytics/рдмреВрдБрдж/рдореБрдЦреНрдп/ultralytics/hub/auth.py рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдпреЛрдЧрджрд╛рди рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ ЁЯЫая╕Пред ЁЯЩП рдзрдиреНрдпрд╡рд╛рдж !



ultralytics.hub.auth.Auth

рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ, рдХреБрдХреА-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рд╣реЗрдбрд░ рдЬрдирд░реЗрд╢рди рд╕рд╣рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред

рдХрдХреНрд╖рд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ: 1. рд╕реАрдзреЗ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред 2. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Google рдХреЛрд▓рд╛рдм рдореЗрдВ)ред 3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рдирд╛ред

рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ:

рдирд╛рдо рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд╝рд┐рд╕реНтАНрдо
id_token str or bool

рдкрд╣рдЪрд╛рди рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЯреЛрдХрди, рдЬрд┐рд╕реЗ рдЧрд▓рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

api_key str or bool

рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП API рдХреБрдВрдЬреА, False рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХреА рдЧрдИ.

model_key bool

рдореЙрдбрд▓ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░, False рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛.

рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб ultralytics/hub/auth.py
class Auth:
    """
    Manages authentication processes including API key handling, cookie-based authentication, and header generation.

    The class supports different methods of authentication:
    1. Directly using an API key.
    2. Authenticating using browser cookies (specifically in Google Colab).
    3. Prompting the user to enter an API key.

    Attributes:
        id_token (str or bool): Token used for identity verification, initialized as False.
        api_key (str or bool): API key for authentication, initialized as False.
        model_key (bool): Placeholder for model key, initialized as False.
    """

    id_token = api_key = model_key = False

    def __init__(self, api_key="", verbose=False):
        """
        Initialize the Auth class with an optional API key.

        Args:
            api_key (str, optional): May be an API key or a combination API key and model ID, i.e. key_id
        """
        # Split the input API key in case it contains a combined key_model and keep only the API key part
        api_key = api_key.split("_")[0]

        # Set API key attribute as value passed or SETTINGS API key if none passed
        self.api_key = api_key or SETTINGS.get("api_key", "")

        # If an API key is provided
        if self.api_key:
            # If the provided API key matches the API key in the SETTINGS
            if self.api_key == SETTINGS.get("api_key"):
                # Log that the user is already logged in
                if verbose:
                    LOGGER.info(f"{PREFIX}Authenticated тЬЕ")
                return
            else:
                # Attempt to authenticate with the provided API key
                success = self.authenticate()
        # If the API key is not provided and the environment is a Google Colab notebook
        elif IS_COLAB:
            # Attempt to authenticate using browser cookies
            success = self.auth_with_cookies()
        else:
            # Request an API key
            success = self.request_api_key()

        # Update SETTINGS with the new API key after successful authentication
        if success:
            SETTINGS.update({"api_key": self.api_key})
            # Log that the new login was successful
            if verbose:
                LOGGER.info(f"{PREFIX}New authentication successful тЬЕ")
        elif verbose:
            LOGGER.info(f"{PREFIX}Get API key from {API_KEY_URL} and then run 'yolo hub login API_KEY'")

    def request_api_key(self, max_attempts=3):
        """
        Prompt the user to input their API key.

        Returns the model ID.
        """
        import getpass

        for attempts in range(max_attempts):
            LOGGER.info(f"{PREFIX}Login. Attempt {attempts + 1} of {max_attempts}")
            input_key = getpass.getpass(f"Enter API key from {API_KEY_URL} ")
            self.api_key = input_key.split("_")[0]  # remove model id if present
            if self.authenticate():
                return True
        raise ConnectionError(emojis(f"{PREFIX}Failed to authenticate тЭМ"))

    def authenticate(self) -> bool:
        """
        Attempt to authenticate with the server using either id_token or API key.

        Returns:
            (bool): True if authentication is successful, False otherwise.
        """
        try:
            if header := self.get_auth_header():
                r = requests.post(f"{HUB_API_ROOT}/v1/auth", headers=header)
                if not r.json().get("success", False):
                    raise ConnectionError("Unable to authenticate.")
                return True
            raise ConnectionError("User has not authenticated locally.")
        except ConnectionError:
            self.id_token = self.api_key = False  # reset invalid
            LOGGER.warning(f"{PREFIX}Invalid API key тЪая╕П")
            return False

    def auth_with_cookies(self) -> bool:
        """
        Attempt to fetch authentication via cookies and set id_token. User must be logged in to HUB and running in a
        supported browser.

        Returns:
            (bool): True if authentication is successful, False otherwise.
        """
        if not IS_COLAB:
            return False  # Currently only works with Colab
        try:
            authn = request_with_credentials(f"{HUB_API_ROOT}/v1/auth/auto")
            if authn.get("success", False):
                self.id_token = authn.get("data", {}).get("idToken", None)
                self.authenticate()
                return True
            raise ConnectionError("Unable to fetch browser authentication details.")
        except ConnectionError:
            self.id_token = False  # reset invalid
            return False

    def get_auth_header(self):
        """
        Get the authentication header for making API requests.

        Returns:
            (dict): The authentication header if id_token or API key is set, None otherwise.
        """
        if self.id_token:
            return {"authorization": f"Bearer {self.id_token}"}
        elif self.api_key:
            return {"x-api-key": self.api_key}

__init__(api_key='', verbose=False)

рд╡реИрдХрд▓реНрдкрд┐рдХ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред

рдкреИрд░рд╛рдореАрдЯрд░:

рдирд╛рдо рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд╝рд┐рд╕реНтАНрдо рдЪреВрдХ
api_key str

рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдпрд╛ рд╕рдВрдпреЛрдЬрди рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдФрд░ рдореЙрдбрд▓ рдЖрдИрдбреА, i.e. key_id рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

''
рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб ultralytics/hub/auth.py
def __init__(self, api_key="", verbose=False):
    """
    Initialize the Auth class with an optional API key.

    Args:
        api_key (str, optional): May be an API key or a combination API key and model ID, i.e. key_id
    """
    # Split the input API key in case it contains a combined key_model and keep only the API key part
    api_key = api_key.split("_")[0]

    # Set API key attribute as value passed or SETTINGS API key if none passed
    self.api_key = api_key or SETTINGS.get("api_key", "")

    # If an API key is provided
    if self.api_key:
        # If the provided API key matches the API key in the SETTINGS
        if self.api_key == SETTINGS.get("api_key"):
            # Log that the user is already logged in
            if verbose:
                LOGGER.info(f"{PREFIX}Authenticated тЬЕ")
            return
        else:
            # Attempt to authenticate with the provided API key
            success = self.authenticate()
    # If the API key is not provided and the environment is a Google Colab notebook
    elif IS_COLAB:
        # Attempt to authenticate using browser cookies
        success = self.auth_with_cookies()
    else:
        # Request an API key
        success = self.request_api_key()

    # Update SETTINGS with the new API key after successful authentication
    if success:
        SETTINGS.update({"api_key": self.api_key})
        # Log that the new login was successful
        if verbose:
            LOGGER.info(f"{PREFIX}New authentication successful тЬЕ")
    elif verbose:
        LOGGER.info(f"{PREFIX}Get API key from {API_KEY_URL} and then run 'yolo hub login API_KEY'")

auth_with_cookies()

рдХреБрдХреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ id_token рд╕реЗрдЯ рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдм рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рдорд░реНрдерд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ред

рджреЗрддрд╛:

рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд╝рд┐рд╕реНтАНрдо
bool

рдпрджрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╕рддреНрдп, рдЕрдиреНрдпрдерд╛ рдЕрд╕рддреНрдпред

рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб ultralytics/hub/auth.py
def auth_with_cookies(self) -> bool:
    """
    Attempt to fetch authentication via cookies and set id_token. User must be logged in to HUB and running in a
    supported browser.

    Returns:
        (bool): True if authentication is successful, False otherwise.
    """
    if not IS_COLAB:
        return False  # Currently only works with Colab
    try:
        authn = request_with_credentials(f"{HUB_API_ROOT}/v1/auth/auto")
        if authn.get("success", False):
            self.id_token = authn.get("data", {}).get("idToken", None)
            self.authenticate()
            return True
        raise ConnectionError("Unable to fetch browser authentication details.")
    except ConnectionError:
        self.id_token = False  # reset invalid
        return False

authenticate()

id_token рдпрд╛ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рджреЗрддрд╛:

рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд╝рд┐рд╕реНтАНрдо
bool

рдпрджрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╕рддреНрдп, рдЕрдиреНрдпрдерд╛ рдЕрд╕рддреНрдпред

рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб ultralytics/hub/auth.py
def authenticate(self) -> bool:
    """
    Attempt to authenticate with the server using either id_token or API key.

    Returns:
        (bool): True if authentication is successful, False otherwise.
    """
    try:
        if header := self.get_auth_header():
            r = requests.post(f"{HUB_API_ROOT}/v1/auth", headers=header)
            if not r.json().get("success", False):
                raise ConnectionError("Unable to authenticate.")
            return True
        raise ConnectionError("User has not authenticated locally.")
    except ConnectionError:
        self.id_token = self.api_key = False  # reset invalid
        LOGGER.warning(f"{PREFIX}Invalid API key тЪая╕П")
        return False

get_auth_header()

рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рджреЗрддрд╛:

рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд╝рд┐рд╕реНтАНрдо
dict

рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╢реАрд░реНрд╖рд▓реЗрдЦ рдпрджрд┐ id_token рдпрд╛ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рд╕реЗрдЯ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рдирд╣реАрдВред

рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб ultralytics/hub/auth.py
def get_auth_header(self):
    """
    Get the authentication header for making API requests.

    Returns:
        (dict): The authentication header if id_token or API key is set, None otherwise.
    """
    if self.id_token:
        return {"authorization": f"Bearer {self.id_token}"}
    elif self.api_key:
        return {"x-api-key": self.api_key}

request_api_key(max_attempts=3)

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреА рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдЗрдирдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрдВред

рдореЙрдбрд▓ рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб ultralytics/hub/auth.py
def request_api_key(self, max_attempts=3):
    """
    Prompt the user to input their API key.

    Returns the model ID.
    """
    import getpass

    for attempts in range(max_attempts):
        LOGGER.info(f"{PREFIX}Login. Attempt {attempts + 1} of {max_attempts}")
        input_key = getpass.getpass(f"Enter API key from {API_KEY_URL} ")
        self.api_key = input_key.split("_")[0]  # remove model id if present
        if self.authenticate():
            return True
    raise ConnectionError(emojis(f"{PREFIX}Failed to authenticate тЭМ"))





2023-11-12 рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ 2023-11-25
рд▓реЗрдЦрдХ: рдЧреНрд▓реЗрди-рдЬреЛрдЪрд░ (3)