diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7aa6ce5..4379fbf 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -4,7 +4,11 @@ build: os: "ubuntu-20.04" tools: python: "3.10" - -python: - install: - - requirements: docs-requirements.txt + jobs: + pre_create_environment: + - asdf plugin add poetry + - asdf install poetry latest + - asdf global poetry latest + - poetry config virtualenvs.create false + post_install: + - poetry install -E docs diff --git a/README.md b/README.md index d3572f5..d300fa9 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,19 @@ keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/", # Get WellKnow config_well_known = keycloak_openid.well_known() +# Get Code With Oauth Authorization Request +auth_url = keycloak_openid.auth_url( + redirect_uri="your_call_back_url", + scope="email", + state="your_state_info") + +# Get Access Token With Code +access_token = keycloak_openid.token( + grant_type='authorization_code', + code='the_code_you_get_from_auth_url_callback', + redirect_uri="your_call_back_url") + + # Get Token token = keycloak_openid.token("user", "password") token = keycloak_openid.token("user", "password", totp="012345") diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index 52c5677..8d65b62 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -58,6 +58,7 @@ class KeycloakAdmin: :param user_realm_name: The realm name of the user, if different from realm_name :param auto_refresh_token: list of methods that allows automatic token refresh. Ex: ['get', 'put', 'post', 'delete'] + :param timeout: connection timeout in seconds """ PAGE_SIZE = 100 diff --git a/src/keycloak/keycloak_openid.py b/src/keycloak/keycloak_openid.py index e2fcca1..82e980c 100644 --- a/src/keycloak/keycloak_openid.py +++ b/src/keycloak/keycloak_openid.py @@ -67,6 +67,7 @@ class KeycloakOpenID: :param verify: True if want check connection SSL :param custom_headers: dict of custom header to pass to each HTML request :param proxies: dict of proxies to sent the request by. + :param timeout: connection timeout in seconds """ def __init__( @@ -183,17 +184,24 @@ class KeycloakOpenID: data_raw = self.connection.raw_get(URL_WELL_KNOWN.format(**params_path)) return raise_error_from_response(data_raw, KeycloakGetError) - def auth_url(self, redirect_uri): - """Get the authentication URL endpoint. - - http://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint - - :return: + def auth_url(self, redirect_uri, scope="email", state=""): + """Get authorization URL endpoint. + + :param redirect_uri: Redirect url to receive oauth code + :type redirect_uri: str + :param scope: Scope of authorization request, split with the blank space + :type: scope: str + :param state: State will be returned to the redirect_uri + :type: str + :returns: Authorization URL Full Build + :rtype: str """ params_path = { "authorization-endpoint": self.well_known()["authorization_endpoint"], "client-id": self.client_id, "redirect-uri": redirect_uri, + "scope": scope, + "state": state, } return URL_AUTH.format(**params_path) diff --git a/src/keycloak/urls_patterns.py b/src/keycloak/urls_patterns.py index b836692..2990362 100644 --- a/src/keycloak/urls_patterns.py +++ b/src/keycloak/urls_patterns.py @@ -34,6 +34,7 @@ URL_INTROSPECT = "realms/{realm-name}/protocol/openid-connect/token/introspect" URL_ENTITLEMENT = "realms/{realm-name}/authz/entitlement/{resource-server-id}" URL_AUTH = ( "{authorization-endpoint}?client_id={client-id}&response_type=code&redirect_uri={redirect-uri}" + "&scope={scope}&state={state} " ) # ADMIN URLS