用户授权
授权与客户端的加密密钥标识符相关联:auth_key_id。授权后无需向方法传递额外参数。
要以机器人身份登录,请按照以下说明操作。
还有一种基于二维码的替代登录流程。”
发送验证码
示例实现:Android版Telegram、TDLIB。
为了显示格式良好且经过验证的电话号码字段,可以通过help.getCountriesList方法获得help.countriesList构造器。
然后,help.countriesList 配置和其他配置值将按此处描述使用。
然后,包含授权码的短信通过 auth.sendCode 发送到用户的手机。
然而,如果使用未来的认证令牌,情况并非总是如此:
未来的认证代币
在先前授权的会话中调用 auth.logOut 时,服务器可能会返回一个 ,该数据应存储在本地数据库中。登录时返回的auth.authorization中也包含
A。
未来认证令牌数据库应始终包含最多20个令牌:随着新令牌的加入,逐一淘汰旧令牌,以保持在该限制以下。
在调用 auth.sendCode 时,数据库中所有未来的认证令牌应提供给 。
如果未来的认证代币与我们尝试登录的账户匹配且代币尚未过期:future_auth_tokenfuture_auth_tokencodeSettings.logout_tokens
- 如果未启用双重认证,auth.sendCode 将直接返回带有会话信息的 auth.sentCodeSuccess 构造器,表明会话已被授权。
- 如果启用了2FA,auth.sendCode 会返回 RPC 错误,要求用户输入2FA密码,但不发送任何授权码。 SESSION_PASSWORD_NEEDED
否则,系统将按照以下逻辑发送授权码:
代码类型
codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true unknown_number:flags.9?true logout_tokens:flags.6?Vector<bytes> token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; auth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType; auth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType; auth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType; auth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType; auth.sentCodeTypeMissedCall#82006484 prefix:string length:int = auth.SentCodeType; auth.sentCodeTypeEmailCode#f450f59b flags:# apple_signin_allowed:flags.0?true google_signin_allowed:flags.1?true email_pattern:string length:int reset_available_period:flags.3?int reset_pending_date:flags.4?int = auth.SentCodeType; auth.sentCodeTypeSetUpEmailRequired#a5491dea flags:# apple_signin_allowed:flags.0?true google_signin_allowed:flags.1?true = auth.SentCodeType; auth.sentCodeTypeFragmentSms#d9565c39 url:string length:int = auth.SentCodeType; auth.sentCodeTypeFirebaseSms#9fd736 flags:# nonce:flags.0?bytes play_integrity_project_id:flags.2?long play_integrity_nonce:flags.2?bytes receipt:flags.1?string push_timeout:flags.1?int length:int = auth.SentCodeType; auth.sentCodeTypeSmsWord#a416ac81 flags:# beginning:flags.0?string = auth.SentCodeType; auth.sentCodeTypeSmsPhrase#b37794af flags:# beginning:flags.0?string = auth.SentCodeType; auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; auth.sentCodeSuccess#2390fe44 authorization:auth.Authorization = auth.SentCode; auth.sentCodePaymentRequired#d7a2fcf9 store_product:string phone_code_hash:string support_email_address:string support_email_subject:string = auth.SentCode; ---functions--- auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode; auth.resendCode#cae47523 flags:# phone_number:string phone_code_hash:string reason:flags.0?string = auth.SentCode; auth.requestFirebaseSms#8e39261e flags:# phone_number:string phone_code_hash:string safety_net_token:flags.0?string play_integrity_token:flags.2?string ios_push_secret:flags.1?string = Bool;auth.sendCode 方法包含启用/禁用闪电呼叫和未接来电的参数,并允许传递包含在发送短信中的 SMS 令牌。
例如,后者在较新的安卓版本中是使用安卓短信接收器API的必需条件。
返回的auth.sentCode对象将包含多个参数:
| 旗帜 | # | 旗帜,参见 TL 条件字段 |
| 类型 | 授权。SentCodeType | 电话代码类型 |
| phone_code_hash | 弦 | 电话代码哈希,存储并在后续方法调用中重复使用 |
| next_type | flags.1?授权。代码类型 | 如果几秒钟内没有收到电话码,接下来将发送的电话码类型:发送时请使用 auth.resendCodetimeout |
| 暂停 | 旗帜.2?智力 | 电话代码接收暂停 |
系统会自动选择如何发送授权码;代码可能通过认证字段向客户端发出信号,有多种可能的到达方式。SentCodeType 构造器。type
请注意,在某些情况下,注册或使用短信代码/通话登录时,只能使用 auth.sentCodeTypeFirebaseSms 代码类型。
目前,只有移动官方应用可以使用Firebase短信认证:这意味着在某些情况下,只有官方应用可以通过短信或电话接收登录/注册码。
第三方应用和非移动官方应用可以使用其他任何代码传递方式登录(Telegram代码、Fragment代码、电子邮件代码、未来认证令牌、二维码)。
开发者若使用第三方应用需要短信授权,可 [email protected] 联系我们,邮件主题中注明。#enableSMS
-
auth.sentCodeTypeSetUpEmailRequired:如果用户登录足够频繁,Telegram会要求用户验证将用来发送登录码的邮件。
有关验证流程的更多信息,请点击这里»。
- auth.sentCodeTypeEmailCode:代码已发送到已配置的登录邮箱。
- auth.sentCodeTypeFragmentSms:代码通过 fragment.com 发送:打开指定地址,用钱包登录Fragment平台查看代码。url
- auth.sentCodeTypeApp:该代码作为Telegram服务通知发送给所有其他登录会话。
-
auth.sentCodeTypeFirebaseSms:仅限官方应用的firebase登录流程。
-
在安卓上,只有在代码设置后才能接收。旗帜已升起。
客户端必须将收到的 auth.sentCodeTypeFirebaseSms./ 传递给 SafetyNet 认证 API/Google Play Integrity API,然后将获得的 JWS 对象连同 和 。
如果方法返回 boolTrue,代码将通过短信发送;否则,必须使用认证方法,即 auth.resendCode。
如果设备完整性验证失败且无法获得令牌来调用 auth.requestFirebaseSms,也必须使用该认证方法:此时,设备完整性验证失败的理由必须传递给 auth.resendCode 的 。allow_firebasenonceplay_integrity_noncesafety_net_tokenplay_integrity_tokenphone_numberphone_code_hashnext_typenext_typereason
-
在 iOS 上,只有当 Apple Push 的设备令牌传递给 codeSettings..
客户端随后等待新的推送通知,发送 auth.sentCodeTypeFirebaseSms。秒数。
如果几秒钟内没有收到推送通知,必须使用认证方法,使用 auth.resendCode。
如果收到带有 和 字段的推送通知,且字段值与 codeSettings..一致,则 的值会传递给 auth.requestFirebaseSms.,连同 和 。
如果方法返回 boolTrue,代码将通过短信发送;否则,必须使用认证方法,即 auth.resendCode。
如果设备完整性验证失败且无法获得密钥调用 auth.requestFirebaseSms,也必须使用该认证方法:此时,设备完整性验证失败的理由必须传达给 auth.resendCode 中。tokenpush_timeoutpush_timeoutnext_typereceiptios_push_secretreceiptreceiptios_push_secretios_push_secretphone_numberphone_code_hashnext_typenext_typereason
-
在安卓上,只有在代码设置后才能接收。旗帜已升起。
- auth.sentCodeTypeSms:代码是通过短信发送的。
-
auth.sentCodeTypeSmsWord:该代码通过短信发送,包含一个单词,即该短信代码。如果设置
了,旗帜包含秘密词的第一个字母。beginning
-
auth.sentCodeTypeSmsPhrase:该代码通过短信发送,包含包含多个词的短语,这些词是短信代码。如果设置
,旗帜包含秘密短语的第一个单词。beginning
- auth.sentCodeTypeCall:用户会接到电话,合成语音会告诉用户输入验证码。
-
auth.sentCodeTypeFlashCall:代码将通过闪电电话发送,该电话将立即关闭。
在这种情况下,电话号码代码就是电话号码本身,只要确保电话号码符合指定的模式(参见 auth.sentCodeTypeFlashCall)。
-
auth.sentCodeTypeMissedCall:代码将通过闪电电话发送,该电话将立即关闭。
拨打的电话号码的最后几位数字是用户必须手动输入的代码。
- 未来认证代币 »
如果消息到达电话需要太长时间(几秒),可以调用 auth.resendCode 方法重新发送类型为 的代码。
如果再次发生同样的情况,你可以使用 auth.resendCode 并结合之前调用 auth.resendCode 返回的
要取消验证码,请使用 auth.cancelCode。timeoutnext_typenext_type
官方应用可能会收到auth.sentCodePaymentRequired:该构建器指出,由于用户所在国家/运营商的短信验证码费用高昂,用户必须购买Telegram Premium订阅才能继续登录/注册。
在成功购买指定商店商品后,将发布一个包含发送代码信息的更新SentPhoneCode更新。
电子邮件验证
auth.sentCodeTypeSetUpEmailRequired#a5491dea flags:# apple_signin_allowed:flags.0?true google_signin_allowed:flags.1?true = auth.SentCodeType; emailVerifyPurposeLoginSetup#4345be73 phone_number:string phone_code_hash:string = EmailVerifyPurpose; emailVerificationCode#922e55a9 code:string = EmailVerification; emailVerificationGoogle#db909ec2 token:string = EmailVerification; emailVerificationApple#96d074fd token:string = EmailVerification; account.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode; account.emailVerifiedLogin#e1bb0d61 email:string sent_code:auth.SentCode = account.EmailVerified; emailVerifyPurposeLoginChange#527d22eb = EmailVerifyPurpose; account.emailVerified#2b96cd1b email:string = account.EmailVerified; ---functions--- account.sendVerifyEmailCode#98e037bb purpose:EmailVerifyPurpose email:string = account.SentEmailCode; account.verifyEmail#32da4cf purpose:EmailVerifyPurpose verification:EmailVerification = account.EmailVerified; auth.resetLoginEmail#7e960193 phone_number:string phone_code_hash:string = auth.SentCode;Telegram 可能会在 auth.sendCode 构造函数中返回 auth.sentCode 构造函数中的 auth.sentCodeTypeSetUpEmailRequired(必需)代码类型。
在这种情况下,客户端应要求用户验证将用于接收登录码的电子邮件地址,具体如下:
-
如果设置了 OR 标志,用户可以直接用 Google/Apple ID 验证邮件,具体配置如下(Google ID)»和此处(Apple ID)»。获得ID令牌
后,拨打account.verifyEmail,提供以下参数:google_signin_allowedapple_signin_allowed
- purpose- 一个 emailVerifyPurposeLoginSetup 构造器
- purpose.phone_number- 用于 auth.sendCode 的电话号码
- purpose.phone_code_hash- auth.sendCode 构造器中包含的电话码哈希
- verification-电子邮件VerificationGoogle 或电子邮件VerificationApple
- verification.token- 由 Google ID API 返回的 ID 令牌。
成功后,account.verifyEmail方法会返回account.emailVerifiedLogin构造器,带有auth.sentCode构造器,应像往常一样处理。
-
否则,请用户输入电子邮件地址,然后致电 account.sendVerifyEmailCode,提供以下参数:
- email- 电子邮件地址
- purpose- 一个 emailVerifyPurposeLoginSetup 构造器
- purpose.phone_number- 用于 auth.sendCode 的电话号码
- purpose.phone_code_hash- auth.sendCode 构造器中包含的电话码哈希
用户收到并输入验证码后,拨打 account.verifyEmail,提供以下参数:
- purpose- 一个 emailVerifyPurposeLoginSetup 构造器
- purpose.phone_number- 用于 auth.sendCode 的电话号码
- purpose.phone_code_hash- auth.sendCode 构造器中包含的电话码哈希
- verification- 邮箱验证码
- verification.code- 用户收到的验证码。
成功后,account.verifyEmail方法会返回account.emailVerifiedLogin构造器,带有auth.sentCode构造器,应像往常一样处理。
如果用户无法访问其电子邮件地址,可以使用 auth.resetLoginEmail 请求电子邮件重置。
登录后要更改登录邮箱,请按照与上述完全相同的 Google ID/Apple ID/邮箱代码登录流程,将 emailVerifyPurposeLoginChange 传递为 ,成功后,account.verifyEmail 方法将返回 account.emailVerified 构造函数。purpose
登录/注册
当用户输入验证码时,必须使用auth.signIn方法来验证验证代码,并可能让用户登录。
如果代码输入正确,但方法返回auth.authorizationSignUpRequired,意味着该电话号码的账户尚未存在:用户需要提供基本信息,接受服务条款,然后必须调用新的用户注册方式(auth.signUp)。
2FA
当用户尝试使用 auth.signIn 登录时,如果启用了双因素认证,可能会返回错误 400 SESSION_PASSWORD_NEEDED。
此时,必须遵循SRP双重认证的说明。
要在已授权账户上设置双因素授权,请遵循SRP双重认证文档。
确认登录
authorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true encrypted_requests_disabled:flags.3?true call_requests_disabled:flags.4?true unconfirmed:flags.5?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization; account.authorizations#4bff8ea0 authorization_ttl_days:int authorizations:Vector<Authorization> = account.Authorizations; updateNewAuthorization#8951abef flags:# unconfirmed:flags.0?true hash:long date:flags.0?int device:flags.0?string location:flags.0?string = Update; ---functions--- account.getAuthorizations#e320c158 = account.Authorizations; account.changeAuthorizationSettings#40f48462 flags:# confirmed:flags.3?true hash:long encrypted_requests_disabled:flags.0?Bool call_requests_disabled:flags.1?Bool = Bool; account.resetAuthorization#df77f3bc hash:long = Bool;登录时,其他已登录的会话将收到 updateNewAuthorization 更新。
如果设置了该标志,客户端应会显示通知,询问用户是否识别该会话。unconfirmed
如果用户点击“是”按钮,请启用account.changeAuthorizationSettings,并设置新会话并设置该标志,确认指定的会话。hashconfirmed
如果用户点击“否”按钮,请用新会话的 调用 account.resetAuthorization,登出指定的会话。hash
如果用户未采取任何操作,会话将在登录后几秒内自动确认(参见关联的客户端配置参数»)。authorization_autoconfirm_period
使登录码失效
如果用户将登录码发送到其他 Telegram 聊天,无论是转发还是在消息中发送,Telegram 服务器会自动使登录码失效;但客户端也应立即手动且立即使登录码失效,如果用户尝试截图或转发包含登录码的用户(ID)发送的消息。777000
如果有消息来,具体如下:
- 由登录通知服务用户(ID )发送777000)
- AND是短信(不是媒体)
- AND 包含一个或多个登录码,定义为 5 到 7 位十进制数字的序列,可选择性地交错使用或后跟任意数量的字符(示例实现 »-)
是:
- 用户截图
- 或者用户转发到任何聊天室
应调用account.invalidateSignInCodes,传递提取的登录信息(不含字符)。codes-
---functions--- account.invalidateSignInCodes#ca8ae8ba codes:Vector<string> = Bool;测试账号
每个电话号码每天登录次数限制有限(例如5次,但可能会更改),之后API将返回FLOOD错误,直到第二天。这可能不足以测试客户端应用中用户授权流程的实现。
有几个保留的电话号码前缀用于测试你的应用是否正确处理数据中心间的重定向、注册、登录和双重认证流程。这些编号仅在测试 DC上可用(其 IP 地址用于 TCP 传输,在获得 api_id 后可在 API 开发工具面板中获得,URI 格式用于 HTTPS/WebSocket 传输)。
如果你想模拟与DC号码X相关的用户应用,注册用户时只需将电话号码指定为,其中YYYY是随机数即可。像这样的用户总是会收到XXXXX作为登录确认码(DC编号,重复五次)。注意,X的值必须在1-3之间,因为只有3个测试DC。当某个测试号码达到洪泛限制时,只需选择另一个数字(改变YYYY随机部分)。99966XYYYY
请勿在此类测试账户的消息中存储任何重要或隐私信息;任何人都可以使用简化授权机制——我们会定期清除存储在该处的所有信息。
只有在确保测试DC上一切正常运行后,才会在生产DC中使用用户授权流,以避免达到洪水极限。
为了帮助你处理生产型 DC,使用注册时相同电话号码登录时的洪水限制更宽松。api_id
我们已经获得授权
由于授权,客户端密钥auth_key_id与用户关联,之后每次使用该密钥的API调用都会以该用户的身份执行。授权方法本身返回的是相关的用户。最好立即将用户ID与密钥绑定本地存储。
只有一小部分API方法对未经授权的用户开放:
- account.delete账户
- account.getPassword
- account.sendVerifyEmailCode
- account.verify邮箱
- auth.bindTempAuthKey
- auth.cancelCode
- auth.check密码
- auth.exportLoginToken
- auth.import授权
- auth.importBotAuthorization
- auth.importLoginToken(认证.importLoginToken)
- auth.importWebTokenAuthorization
- auth.reportMissingCode
- auth.requestFirebaseSms
- auth.resendCode
- auth.resetLoginEmail
- auth.sendCode
- auth.signIn
- auth.signUp
- help.getAppConfig
- help.getConfig
- help.getCountriesList
- help.getDeepLinkInfo
- 帮助.getNearestDc
- help.saveAppLog
- initConnection
- invokeWithLayer
- langpack.getDifference
- langpack.getLangPack
- langpack.getLanguage
- langpack.getLanguages
- langpack.getStrings
- payments.assignAppStoreTransaction
- payments.assignPlayMarketTransaction。
- payments.canPurchaseStore
- payments.getPaymentForm
- payments.sendPaymentForm
其他方法则会导致错误:401 未授权。
请注意,RPC数据库中也提供了可通过未授权连接调用的方法的完整JSON版本。
冻结账户
账户因严重违反Telegram服务条款而被冻结。
冻结账户处于只读模式,调用多种方法会触发以下错误之一:
- FROZEN_METHOD_INVALID(420):冻结账户完全无法使用指定方法。
- FROZEN_PARTICIPANT_MISSING(400):即使冻结账户可以使用指定的方法,冻结账户仍无法访问指定的对等节点。
冻结账户在一定时间后会被删除,除非提交申诉并被接受。
当客户端收到 时,应调用 help.getAppConfig 以获取以下新填充字段:FROZEN_METHOD_INVALID
- freeze_since_date- 如果设置为且非零,表示账户被冻结的时间(整数,UnixTime)
- freeze_until_date- 如果设置为且非零,表示账户何时被删除,除非向(整数,Unixtime)提交并接受申诉freeze_appeal_url
- freeze_appeal_url- 用户可打开提交申诉的URL(字符串)