def _phase1_background(meta, dialog, verifier, builder):
    try:
        logger.info("starting token obtaining in background")
        r = get_instance_info(instance_uri=meta.instance_base_uri,
                              verifier=verifier)
        meta.api_base_uri, meta.authorization_endpoint, meta.token_endpoint = r
    except Exception as e:
        GLib.idle_add(lambda: error_helper(dialog, "Can't fetch instance info",
                                           "{}".format(str(e))))
        GLib.idle_add(lambda: dialog.hide())
        raise

    meta.refresh_token()
    if not meta.token:
        code_verifier = gen_code_verifier()
        port = get_open_port()
        try:
            oauth = create_oauth_session(port,
                                         auto_refresh_url=meta.token_endpoint)
            auth_url = get_auth_url(oauth, code_verifier,
                                    meta.authorization_endpoint)
        except Exception as e:
            GLib.idle_add(lambda: error_helper(
                dialog, "Can't create oauth session", "{}".format(str(e))))
            GLib.idle_add(lambda: dialog.hide())
            raise
        else:
            GLib.idle_add(lambda: _phase1_callback(
                meta, port, code_verifier, oauth, auth_url, dialog, builder))
    else:
        logger.info("we already have a token, skipping browser step")
        oauth = oauth_from_token(meta=meta)
        GLib.idle_add(lambda: _phase2_callback(
            meta=meta, oauth=oauth, dialog=dialog, builder=builder))
示例#2
0
def get_oauth(token_endpoint: str, authorization_endpoint: str):
    port = get_open_port()
    redirect_uri = f'http://127.0.0.1:{port}/callback'
    oauth = OAuth2Session(CLIENT_ID,
                          redirect_uri=redirect_uri,
                          auto_refresh_url=token_endpoint,
                          scope=SCOPE)

    code_verifier = gen_code_verifier()
    code_challenge = gen_code_challenge(code_verifier)
    authorization_url, state = oauth.authorization_url(
        url=authorization_endpoint,
        code_challenge_method=CODE_CHALLENGE_METHOD,
        code_challenge=code_challenge)

    webbrowser.open(authorization_url)
    response = one_request(port, lets_connect=False)
    code = response['code'][0]
    assert (state == response['state'][0])
    token = oauth.fetch_token(token_url=token_endpoint,
                              code=code,
                              code_verifier=code_verifier,
                              client_id=oauth.client_id,
                              include_client_id=True)
    return oauth
def _phase1_background(meta, dialog, verifier, builder, force_token_refresh,
                       lets_connect):
    # type: (Metadata, Any, str, Gtk.builder, Optional[bool], bool) -> None
    try:
        logger.info(u"starting token obtaining in background")
        r = get_instance_info(instance_uri=meta.instance_base_uri,
                              verifier=verifier)
        meta.api_base_uri, meta.authorization_endpoint, meta.token_endpoint = r  # type: ignore
    except Exception as e:
        error = e
        GLib.idle_add(lambda: error_helper(dialog, "Can't fetch instance info",
                                           "{}".format(str(error))))
        GLib.idle_add(lambda: dialog.hide())
        raise

    meta.refresh_token()

    if not meta.token and not force_token_refresh:
        # lets see if other profiles already have a token we can use
        token = reuse_token_from_base_uri(meta.instance_base_uri)
        if token:
            meta.token = token

    if not meta.token:
        code_verifier = gen_code_verifier()
        port = get_open_port()
        try:
            oauth = create_oauth_session(port,
                                         lets_connect=lets_connect,
                                         auto_refresh_url=meta.token_endpoint)
            auth_url, state = get_auth_url(
                oauth, code_verifier,
                meta.authorization_endpoint)  # type: ignore
        except Exception as e:
            error = e
            GLib.idle_add(lambda: error_helper(
                dialog, "Can't create oauth session", "{}".format(str(error))))
            GLib.idle_add(lambda: dialog.hide())
            raise
        else:
            GLib.idle_add(lambda: _phase1_callback(meta,
                                                   port,
                                                   code_verifier,
                                                   oauth,
                                                   auth_url,
                                                   dialog,
                                                   builder,
                                                   state,
                                                   lets_connect=lets_connect))
    else:
        logger.info(u"we already have a token, skipping browser step")
        oauth = oauth_from_token(meta=meta, lets_connect=lets_connect)
        GLib.idle_add(lambda: _phase2_callback(meta=meta,
                                               oauth=oauth,
                                               dialog=dialog,
                                               builder=builder,
                                               lets_connect=lets_connect))
示例#4
0
def get_oauth_token(user, password, instance_uri):
    meta = Metadata()
    meta.api_base_uri, meta.authorization_endpoint, meta.token_endpoint = get_instance_info(
        instance_uri=instance_uri)
    meta.refresh_token()
    code_verifier = gen_code_verifier()
    port = get_open_port()
    oauth = create_oauth_session(port, auto_refresh_url=meta.token_endpoint)
    auth_url, state = get_auth_url(oauth, code_verifier,
                                   meta.authorization_endpoint)

    with ThreadPoolExecutor(max_workers=1) as executor:
        future = executor.submit(get_oauth_token_code, port, timeout=5)
        authorize(auth_url, user, password)
        code, other_state = future.result()

    assert (state == other_state)
    meta.token = oauth.fetch_token(meta.token_endpoint,
                                   code=code,
                                   code_verifier=code_verifier)
    return oauth, meta
示例#5
0
 def test_gen_code_verifier(self):
     gen_code_verifier()