【问题标题】:Yahoo Fantasy Sports example using OAuth2使用 OAuth2 的 Yahoo Fantasy Sports 示例
【发布时间】:2018-06-23 14:52:51
【问题描述】:

我想构建一个应用程序来查询我的 Yahoo! 中的数据Fantasy League,但无法通过 3-legged OAuth 身份验证,并希望有人能给我一个快速演示,或指向相关教程。

我愿意使用 NodeJS、Python 或 PHP。

我已经注册了一个 API 并获得了消费者密钥和消费者秘密。

Their documentation 包含两个 PHP 示例(我无法开始工作)和引用 OAuth.net's list of libaries

但是让我们以 Python 为例。 rauth documentation 仅列出 第一条腿,我应该如何完成另外两条腿?

from rauth import OAuth2Service

yahoo = OAuth2Service(  
client_id='mykey',
client_secret='mysecret',
name='yahoo',
authorize_url='https://api.login.yahoo.com/oauth/v2/request_auth',
access_token_url='https://api.login.yahoo.com/oauth/v2/get_token',
base_url='https://api.login.yahoo.com/oauth/v2/')

url = yahoo.get_authorize_url()

我在 GitHub.com 上找到的几乎所有示例都有多年历史,并且存在兼容性问题,尽管 yahoofantasysandbox 似乎几乎就在那里。

This tutorial 推荐使用fantasy-sports,但我没有看到很多关于实现或示例的细节。

有人可以为我指出正确的方向或给我一个工作代码的演示吗?

【问题讨论】:

  • 刚刚看到这个...我构建了幻想沙箱...不确定您遇到了什么问题,但 OAuth2 在使用 Oauth2 护照策略的沙箱应用程序中运行良好...跨度>

标签: php node.js oauth-2.0 yahoo-api


【解决方案1】:

一年后,我自己设法做到了。

TL;DR:如果你想访问 Yahoo Fantasy API,只需使用我创建的这个 NodeJS 工具:https://github.com/edwarddistel/yahoo-fantasy-baseball-reader

如果您想在 NodeJS 或 PHP 中创建自己的应用程序,方法如下:

  1. 转到https://developer.yahoo.com/apps/create/,获取Consumer KeyConsumer Secret

  2. Consumer Key放入https://api.login.yahoo.com/oauth2/request_auth?client_id=YOUR-CONSUMER-KEY-GOES-HERE&redirect_uri=oob&response_type=code&language=en-us并同意允许访问,然后获取授权码

  3. 构造Auth标头,CONSUMER_KEY:CONSUMER_SECRET的Base64编码:

const AUTH_HEADER = Buffer.from(`${CONSUMER_KEY}:${CONSUMER_SECRET}`, `binary`).toString(`base64`);
  1. Yahoo 需要 x-www-form-urlencoded,因此如果使用像 Axios 这样的 HTTP 请求库,您需要按照 docs 对数据进行字符串化

  2. 向 Yahoo 发出请求。这是一个例子:

function getInitialAuthorization () {
    return axios({
        url: `https://api.login.yahoo.com/oauth2/get_token`,
        method: 'post',
        headers: {
            'Authorization': `Basic ${AUTH_HEADER}`,
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
        },
        data: qs.stringify({
            client_id: CONSUMER_KEY,
            client_secret: CONSUMER_SECRET,
            redirect_uri: 'oob',
            code: YAHOO_AUTH_CODE,
            grant_type: 'authorization_code'
        }),
        timeout: 1000,
        }).catch((err) => {
            console.error(`Error in getInitialAuthorization(): ${err}`);
        });
}
  1. 获取该响应并将其写入文件。您需要这些凭据才能每使用 60 分钟重新授权应用一次。

  2. 向 Yahoo API 发出正常的 HTTP 请求。检查响应,如果授权令牌已过期,请使用稍微不同的一组参数重新授权:

function refreshAuthorizationToken (token) {
    return axios({
        url: `https://api.login.yahoo.com/oauth2/get_token`,
        method: 'post',
        headers: {
            'Authorization': `Basic ${AUTH_HEADER}`,
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
        },
        data: qs.stringify({
            redirect_uri: 'oob',
            grant_type: 'refresh_token',
            refresh_token: token
        }),
        timeout: 10000,
    }).catch((err) => {
        console.error(`Error in refreshAuthorizationToken(): ${err}`);
    });       
}
  1. 发出 API 请求并检查授权的示例:
// Hit the Yahoo Fantasy API
async function makeAPIrequest (url) {
    let response;
    try {
        response = await axios({
        url: url,
            method: 'get',
            headers: {
                'Authorization': `Bearer ${CREDENTIALS.access_token}`,
                'Content-Type': 'application/x-www-form-urlencoded',
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
            },
            timeout: 10000,
        });
        const jsonData = JSON.parse(parser.toJson(response.data));
        return jsonData;
    } catch (err) {
        if (err.response.data && err.response.data.error && err.response.data.error.description && err.response.data.error.description.includes("token_expired")) {
            const newToken = await refreshAuthorizationToken(CREDENTIALS.refresh_token);
            if (newToken && newToken.data && newToken.data.access_token) {
                CREDENTIALS = newToken.data;
                // Just a wrapper for fs.writeFile
                writeToFile(JSON.stringify(newToken.data), AUTH_FILE, 'w');
                return makeAPIrequest(url, newToken.data.access_token, newToken.data.refresh_token);

             }
        } else {
            console.error(`Error with credentials in makeAPIrequest()/refreshAuthorizationToken(): ${err}`);
            process.exit();
        }
    }
}

这是一个 PHP 示例:

function getInitialAuthorizationToken() {

    $ch = curl_init();

    $post_values = [
        "client_id" => $GLOBALS['consumer_key'],
        "client_secret" => $GLOBALS['consumer_secret'],
        "redirect_uri" => "oob",
        "code" => $GLOBALS['initial_auth_code'],
        "grant_type" => "authorization_code"
    ];

    curl_setopt_array($ch, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $GLOBALS['auth_endpoint'],
        CURLOPT_POST => 1,
        CURLOPT_HTTPHEADER => array(
        'Authorization: Basic ' . $GLOBALS['auth_header'],
        'Content-Type: application/x-www-form-urlencoded',
        'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'),
        CURLOPT_POSTFIELDS => http_build_query($post_values)
    ));

    $answer = curl_exec($ch);
    if (isset($answer)) writeToFile($answer);

    if (!isset($access_token)) {
        echo "Error!";
        die;

    }
    else {
        return $token;
    }

}

希望这对其他人有所帮助。

【讨论】:

  • 第 5 步给了我错误的请求错误 400。知道为什么吗?我遵循了所有其他步骤。
  • 我在 getInitialAuthorization 的错误处理程序中添加了console.error(err.response);,并意识到步骤 2 中的授权代码只能使用一次。所以我重复了第 2 步并运行了代码,然后我能够完成第 5 步。感谢本指南,这是迄今为止我找到的最有用的指南!
猜你喜欢
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多