使用Node.js通过Steam登录网站

5
我正在尝试使用nodejs登录网站,例如csgolounge,该网站要求进行Steam登录验证。虽然我尝试了一些方法,但它们都没有接近工作,因此包括代码在内也没有意义。
我想知道是否有任何方法可以实现这一点。
编辑:我认为我错误地提出了问题,我希望node应用程序使用Steam登录到csgolounge,而不是拥有一个类似于csgolounge的具有登录选项的网站。

你有尝试使用Steam API吗? - Frederik.L
1
其他人已经成功地使用了这些库(至少我希望如此!)。请发布一个最小化,完整化和可验证的示例,展示您尝试过但失败的代码以及所有错误信息。 - Dave Ross
这段时间过去了,但你成功让它工作了吗?我也在尝试登录一个使用Steam OpenID的网站。问候! - Thomas Weiss
2个回答

4

回答你的问题,是的。有一种方法可以做到这一点。

首先,您需要获取Steam API密钥,您可以前往此处进行操作。然后按照Steam的说法:

只需为所选择的语言和平台下载OpenID库,然后使用http://steamcommunity.com/openid作为提供程序。返回的声明ID将包含用户的64位SteamID。声明的ID格式为:http://steamcommunity.com/openid/id/

如果您想使用Node.JS,我建议查看node-jsonwebtokenpassport-openidconnect。如果您选择使用passport,已经有人开发了一个“策略”来包括steam。请在此处查看。


我想知道你是否正确理解了我的问题,因为我认为我完全写错了。我不想要一个像csgolounge一样有steam登录功能的网站。我想让我的node应用程序登录到使用steam身份验证的csgolounge网站。我不确定你是否正确理解了我的意思,因为我以前使用过steam api,但我不知道是否有一种方法可以使用openid登录到steam并返回已登录的csgolounge? - Hel Oe

2
我有同样的问题,不知道是否能帮到你,但我编写了一些方法来获取用户的steamID,然后你可以使用它来获取用户信息,具体方法请参考this method。我只是在了解如何使用PHP的情况下完成了这个任务,这就是为什么我想在js上重新编写它的原因。
1)构建链接的方法
const http_build_query = (obj) => {
    let str = ""

    for (const key in obj) {
        const value = obj[key];
        str += `${key}=${value}&`;
    }

    return str;
}

2)返回链接的方法,您可以使用该链接进行Steam登录(也可以在其中使用)。

const genUrl = (urlToReturnTo) => {
    const params = {
        'openid.ns'         : 'http://specs.openid.net/auth/2.0',
        'openid.mode'       : 'checkid_setup',
        'openid.return_to'  :  urlToReturnTo,
        'openid.realm'      : 'http://localhost:8080',
        'openid.identity'   : 'http://specs.openid.net/auth/2.0/identifier_select',
        'openid.claimed_id' : 'http://specs.openid.net/auth/2.0/identifier_select',
    };

    const url = `${STEAM_LOGIN}?${http_build_query(params)}`
    return url;
};

在 genUrl 方法中,您需要将要重定向到的 url 作为参数传递。如果登录成功,您将被重定向到该 url,并且 url 中将有一些参数,它看起来像 "http://yoururl?here_is_params",您需要从 url 中获取一些参数 [here_is_params],我使用了以下方法:
const search = location.search.substring(1);
const urlObj = JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')

那么在此之后,您将拥有一个带有查询参数的对象。

3)现在您只需要从此对象中获取steamID:

const getUserId = (response) =>
{
    const str = response["openid.claimed_id"];
    const res = decodeURIComponent(str)
    const propsArr = res.split("\/");
    console.log(propsArr);

    return propsArr[propsArr.length-1];
}


const userId = getUserId(urlObj)

4) 现在你有了userId,你只需要使用fetch或axios发送请求即可。它会返回一个JSON对象,其中包含用户数据

 http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={apiKey}&steamids=${userId} 

如果用户修改查询字符串并将claimed_id设置为另一个Steam ID,会发生什么? - Sergio
我不确定我是否理解正确,但无论如何,如果您修改网址,则会收到不同的响应。如果我没有理解正确,请更详细地阐述您的问题。 - madfluger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接