def _get_oauth_access_token(self, client_id, client_secret, user_id, user_password, scope):
response = requests.post(<EOL>urljoin(self.enterprise_configuration.degreed_base_url, self.global_degreed_config.oauth_api_path),<EOL>data={<EOL>'<STR_LIT>': '<STR_LIT:password>',<EOL>'<STR_LIT:username>': user_id,<EOL>'<STR_LIT:password>': user_password,<EOL>'<STR_LIT>': scope,<EOL>},<EOL>auth=(client_id, client_secret),<EOL>headers={'<STR_LIT:Content-Type>': '<STR_LIT>'}<EOL>)<EOL>response.raise_for_status()<EOL>data = response.json()<EOL>try:<EOL><INDENT>expires_at = data['<STR_LIT>'] + int(time.time())<EOL>return data['<STR_LIT>'], datetime.datetime.utcfromtimestamp(expires_at)<EOL><DEDENT>except KeyError:<EOL><INDENT>raise requests.RequestException(response=response)<EOL><DEDENT>
Retrieves OAuth 2.0 access token using the client credentials grant.

        Args:
            client_id (str): API client ID
            client_secret (str): API client secret
            user_id (str): Degreed company ID
            user_password (str): Degreed user password
            scope (str): Must be one of the scopes Degreed expects:
                        - `CONTENT_PROVIDER_SCOPE`
                        - `COMPLETION_PROVIDER_SCOPE`

        Returns:
            tuple: Tuple containing access token string and expiration datetime.
        Raises:
            HTTPError: If we received a failure response code from Degreed.
            RequestException: If an unexpected response format was received that we could not parse.