def absolute_login_url(provider_id, fence_idp=None, shib_idp=None):
    '\n    Args:\n        provider_id (str): provider to log in with; an IDP_URL_MAP key.\n        fence_idp (str, optional): if provider_id is "fence"\n            (multi-tenant Fence setup), fence_idp can be any of the\n            providers supported by the other Fence. If not specified,\n            will default to NIH login.\n        shib_idp (str, optional): if provider_id is "fence" and\n            fence_idp is "shibboleth", shib_idp can be any Shibboleth/\n            InCommon provider. If not specified, will default to NIH\n            login.\n\n    Returns:\n        str: login URL for this provider, including extra query\n            parameters if fence_idp and/or shib_idp are specified.\n    '
    try:
        base_url = config['BASE_URL'].rstrip('/')
        login_url = (base_url + '/login/{}'.format(IDP_URL_MAP[provider_id]))
    except KeyError as e:
        raise InternalError('identity provider misconfigured: {}'.format(str(e)))
    params = {}
    if fence_idp:
        params['idp'] = fence_idp
    if shib_idp:
        params['shib_idp'] = shib_idp
    login_url = add_params_to_uri(login_url, params)
    return login_url
Args:
    provider_id (str): provider to log in with; an IDP_URL_MAP key.
    fence_idp (str, optional): if provider_id is "fence"
        (multi-tenant Fence setup), fence_idp can be any of the
        providers supported by the other Fence. If not specified,
        will default to NIH login.
    shib_idp (str, optional): if provider_id is "fence" and
        fence_idp is "shibboleth", shib_idp can be any Shibboleth/
        InCommon provider. If not specified, will default to NIH
        login.

Returns:
    str: login URL for this provider, including extra query
        parameters if fence_idp and/or shib_idp are specified.
def absolute_login_url(provider_id, fence_idp=None, shib_idp=None):
    '\n    Args:\n        provider_id (str): provider to log in with; an IDP_URL_MAP key.\n        fence_idp (str, optional): if provider_id is "fence"\n            (multi-tenant Fence setup), fence_idp can be any of the\n            providers supported by the other Fence. If not specified,\n            will default to NIH login.\n        shib_idp (str, optional): if provider_id is "fence" and\n            fence_idp is "shibboleth", shib_idp can be any Shibboleth/\n            InCommon provider. If not specified, will default to NIH\n            login.\n\n    Returns:\n        str: login URL for this provider, including extra query\n            parameters if fence_idp and/or shib_idp are specified.\n    '
    try:
        base_url = config['BASE_URL'].rstrip('/')
        login_url = (base_url + '/login/{}'.format(IDP_URL_MAP[provider_id]))
    except KeyError as e:
        raise InternalError('identity provider misconfigured: {}'.format(str(e)))
    params = {}
    if fence_idp:
        params['idp'] = fence_idp
    if shib_idp:
        params['shib_idp'] = shib_idp
    login_url = add_params_to_uri(login_url, params)
    return login_url