日々是好日

プログラミングについてのあれこれ、ムダ知識など

VSCode 拡張機能開発で OAuth 認証 - 2.5

前回の記事のリクエスト部分を書き直した。

やったことはaxiosを追放して、request及びoauthモジュールで OAuth 認証を完了させたところ。すまんaxios

    startOAuth = async () => {
        const oauth = new OAuth.OAuth(
            api.TMP_CREDENTIAL_REQUEST_URL,
            api.USER_TOKEN_URL,
            api.COMSUMER_KEY,
            api.COMSUMER_SECRET,
            '1.0',
            'oob',
            'HMAC-SHA1'
        );

        //リクエストトークン取得
        await oauth.getOAuthRequestToken({
            "scope": "read_public,write_public,read_private"
        }, async (err, request_token, request_token_secret, results) => {
            console.log('===============');
            console.log(err);
            console.log("request token: " + request_token);
            console.log('===============');

            console.log('redirectUrl: ' + api.RES_OWNER_AUTH_URL + '?oauth_token=' + request_token);

            //ヘッダーを定義
            const headers = {'Content-Type':'application/json'};

            //オプションを定義
            const loginOptions = {
                url: api.LOGIN_URL,
                method: 'POST',
                headers: headers,
                json: true,
                form: account
            };

            //Cookie取得してログイン状態にする
            await request(loginOptions, async (error, response, body) => {
                const cookie = response.headers['set-cookie'];
                if (error === null && cookie !== undefined){
                    const _rk = (cookie as string[])[5].match("(rk=.*); domain");
                    if (_rk !== null){
                        const rk = _rk[1];
                        console.log('rk: ' + rk);

                        const reqTokenOptions = {
                            url: api.RES_OWNER_AUTH_URL,
                            qs: { oauth_token: request_token },
                            method: 'GET',
                            headers: { cookie: rk }
                        };

                        //Cookie付与してリダイレクト
                        await request(reqTokenOptions, async (err, res, body) => {
                            console.log(err);
                            console.log(res);

                            const data = body as string;
                            const _rkm = data.match("name=\"rkm\" value=\"(.*)\"");
                            
                            if (_rkm !== null){
                                const rkm = _rkm[1];
                                console.log('rkm: ' + rkm);

                                const verifierOptions = {
                                    url: api.RES_OWNER_AUTH_URL,
                                    qs: { oauth_token: request_token, rkm: rkm },
                                    method: 'POST',
                                    headers: { cookie: rk }
                                };

                                //許可ボタン押下相当のリクエスト送ってverifier取得
                                await request(verifierOptions, async (err, res, body) => {
                                    const data = body as string;
                                    const _verifier = data.match("<div class=verifier><pre>(.*)</pre></div>");

                                    if (err === null && _verifier !== null){
                                        const verifier = _verifier[1];
                                        console.log('verifier: ' + verifier);

                                        //Access Token の取得
                                        await oauth.getOAuthAccessToken(request_token, request_token_secret, verifier,
                                            (err, accessToken, accessTokenSecret, parsedQueryString) => {
                                                if (err === null){
                                                    console.log(">>>Congraturations!!<<<");
                                                    console.log('AccessToken: ' + accessToken);
                                                    console.log('AccessTokenSecret: ' + accessTokenSecret);
                                                    console.log('ParsedQueryString: ' + parsedQueryString);

                                                    this.accessToken = accessToken;
                                                    this.accessTokenSecret = accessTokenSecret;
                                                } else {
                                                    console.log(err);
                                                }
                                        });
                                    }
                                });
                            }
                        });
                    }
                } else {
                    console.log(error);
                }
            });
        });
    }

requestモジュールだけで事足りるやんけー(´・ω・`)シランガナ

でもやっぱりネスト深くなりすぎなのでなんとかしたい。ひとつの非同期処理が終わるとその値を受け取って次の非同期処理を開始する処理ってどういう形で実装すればいいんかな?