Steam WebAPI AuthenticateUser

时间:2016-06-12 14:51:13

标签: python authentication encryption steam-web-api

如何通过https://api.steampowered.com/ISteamUserAuth/AuthenticateUser/v0001 api方法授权用户?

例如,我将从https://steamcommunity.com/login/getrsakey/获取Steam公钥数据,进行一些加密,然后将此数据作为POST发送到指定的api url。 但服务器每次都会返回'403 Forbidden'。

我的代码示例:

from Crypto.Cipher import AES
from Crypto.Cipher.PKCS1_v1_5 import PKCS115_Cipher
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
import hashlib
import json
import requests

steamid = '<MY_STEAMID64>'
steampass = '<MY_STEAM_PASSWORD>'
loginkey = hashlib.md5(bytes(steampass, 'utf-8')).hexdigest()
blob32 = get_random_bytes(32)

getrsa_url = 'https://steamcommunity.com/login/getrsakey/'
getrsa_data = {'username': '<MY_STEAM_USERNAME>'}

getrsa_resp = requests.get(getrsa_url, params=getrsa_data)
response = json.loads(getrsa_resp.text)
if response.get('success'):
    steam_publickey_mod = response.get('publickey_mod')
    steam_publickey_mod = int(steam_publickey_mod, 16)
    steam_publickey_exp = response.get('publickey_exp')
    steam_publickey_exp = int(steam_publickey_exp, 16)
    steam_rsa_key = RSA.construct((steam_publickey_mod, steam_publickey_exp))
    steam_rsa = PKCS115_Cipher(steam_rsa_key)

if steam_rsa_key.can_encrypt():
    sessionkey = steam_rsa.encrypt(blob32)
    if type(sessionkey) is tuple:
        sessionkey = sessionkey[0]
    steam_aes = AES.new(blob32)
    encrypted_loginkey = steam_aes.encrypt(loginkey)

if all([steamid, sessionkey, encrypted_loginkey]):
    authenticate_user_url = (
        'https://api.steampowered.com/ISteamUserAuth/AuthenticateUser/v0001')
    authenticate_user_json = {
        'steamid': steamid,
        'sessionkey': sessionkey,
        'encrypted_loginkey': encrypted_loginkey,
    }


if __name__ == '__main__':
    import ipdb
    ipdb.set_trace()
    authenticate_user_resp = requests.post(url=authenticate_user_url,
                                           data=authenticate_user_json)

authenticate_user_resp.ok返回False

authenticate_user_resp.status_code返回403

authenticate_user_resp.reason返回Forbidden

对不起我的英语不好,请

2 个答案:

答案 0 :(得分:2)

AuthenticateUser不会按照您的想法执行操作。 Steam客户端使用它来获取当前登录到客户端的用户的Web会话登录cookie。 AuthenticateUser请求的登录密钥来自CM(客户端连接的服务器)。

如果要将用户登录到网站,则需要使用HTTP端点来执行此操作。获得RSA密钥并使用该密钥加密密码后,您可以通过在正文中使用这些urlencoded参数发送到https://steamcommunity.com/login/dologin/进行身份验证:

  • captcha_text - 空字符串或您已提示
  • 的验证码文字
  • captchagid - 您已提示的CAPTCHA的GID,如果您还没有
  • ,则为-1
  • emailauth - 发送到您的电子邮件地址的Steam Guard代码,如果不适用,则为空字符串
  • emailsteamid - 空字符串
  • loginfriendlyname - 空字符串
  • password - 使用RSA公钥加密的密码,以及base64中生成的密文
  • remember_login - true如果您想记住您的登录信息,或false如果没有(字符串truefalse
  • rsatimestamp - 使用RSA密钥获得的时间戳
  • twofactorcode - 您从移动应用中获得的TOTP代码,如果不适用,则为空字符串
  • username - 您的帐户名称

答案 1 :(得分:0)

就我而言,你不被允许做这个操作,因此&#34; 403被禁止&#34; 403所以,你根本就没有被授权&#34;使用您拥有的凭据执行此操作。

https://en.wikipedia.org/wiki/HTTP_403

  

403响应通常表示以下两种情况之一:

     

提供了身份验证,但未通过身份验证的用户   允许执行请求的操作。操作是   禁止所有用户。例如,请求目录列表   禁用目录列表时返回代码403。