Telegram第三方登录步骤
网上看到的不多,简单做个记录,本文主要对下面的文章做补充
整体步骤为:
- 找 botFather 创建机器人
- 给机器人设置域名白名单,用于设置回调地址,官方回把用户信息返回此处,所以注意,域名需要能被 tg 官方调用到,像内网、国内 ip 等,是无法回调成功的;而且需要配置 https
- 去官方的
https://core.telegram.org/widgets/login#widget-configuration选择回调方式;回调方式有两种,第一种直接返回前端,第二种接口后端
以第一种为例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script async src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="watchx_test2_bot" data-size="large" data-onauth="onTelegramAuth(user)" data-request-access="write"></script>
<script type="text/javascript">
function onTelegramAuth(user) {
alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')');
}
</script></body>
</html>
由于官方源码 iframe 弹窗,所以需要把 script 标签放入 body 中
最后,前端把获取到的 name,last_name,等信息,全部传到后端,后端根据哈希做完整性校验,其中 botToken 就是前面拿到的 token
逻辑参考:
https://gist.github.com/MakStashkevich/7ae71729adbe3cbe2a662a7e16df6ea2
@Data
public class OauthTgDto {
/** tg id*/
String id;
String firstName;
String username;
/** 推特头像*/
String photoUrl;
/** 授权时间*/
String authDate;
/** 验证哈希*/
String hash;
}
public static boolean checkTelegramAuthorization(OauthTgDto params, String botToken) throws NoSuchAlgorithmException, InvalidKeyException {
// 构造数据字符串
String dataCheckString = getTokenStringBuilder(params);
// 使用 bot token 计算密钥
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] secretKey = digest.digest(botToken.getBytes(StandardCharsets.UTF_8));
// 使用密钥计算哈希
Mac sha256Hmac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "HmacSHA256");
sha256Hmac.init(secretKeySpec);
byte[] computedHash = sha256Hmac.doFinal(dataCheckString.getBytes(StandardCharsets.UTF_8));
// 将计算出的哈希值转换为 Base64 编码
String computedHashString = bytesToHex(computedHash);
// 比较计算的哈希和传递的哈希
return !computedHashString.equals(params.getHash());
}
private static @NotNull String getTokenStringBuilder(OauthTgDto params) {
Map<String, String> dataMap = new HashMap<>();
dataMap.put("auth_date", params.getAuthDate());
dataMap.put("first_name", params.getFirstName());
dataMap.put("id", params.getId());
dataMap.put("username", params.getUsername());
dataMap.put("photo_url", params.getPhotoUrl());
return dataMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("\n"));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
这是一段防爬代码块,我不介意文章被爬取,但请注明出处
console.log("作者主页:https://www.cnblogs.com/Go-Solo");
console.log("原文地址:https://www.cnblogs.com/Go-Solo/p/18367728");
Telegram第三方登录步骤的更多相关文章
- iOS - Share 分享/第三方登录
1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...
- 第三方登录(QQ登录)开发流程详解
原文:http://www.cnblogs.com/it-cen/p/4338202.html 近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑 ...
- 第三方登录 ----转载自简书,作者 <<碧霄问鼎>>
这几天遇到一个需求:做第三方登录和分享.遇到了一些坑,把整个过程整理记录下来,方便他人,同时也捋一下思路. 当时考虑过把每个平台的SDK下载下来,一个一个弄,一番取舍后决定还是用ShareSDK.这里 ...
- QQ第三方登录
QQ第三方登录 在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块.除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度.腾讯等开发者平台提供的第三方账号登录模块.最近研 ...
- CI框架 QQ接口(第三方登录接口PHP版)
本帖内容较多,大部分都是源码,要修改的地方只有一个,其他只要复制过去,就可以完美运行.本帖主要针对CI框架,不用下载SDK,按我下面的步骤,建文件,复制代码就可以了.10分钟不要,接口就可完成.第一步 ...
- 开放平台-web实现人人网第三方登录
应用场景 web应用通过人人网登录授权实现第三方登录. 操作步骤 1 注册成为人人网开放平台开发者 http://app.renren.com/developer ...
- 开放平台-web实现QQ第三方登录
应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1 注册成为QQ互联平台开发者,http://connect.qq.com/ 2 准备一个可访问的域名, ...
- 第三方登录开发-Facebook
这次这个项目要分别可以使用新浪微博,qq互联以及Facebook和Twitter授权登录 facebook目前只支持oauth2技术,个人理解其工作流程是当用户想访问当前网站,却不想注册账号,此时当前 ...
- 关于Google+以及Facebook第三方登录实现的一点总结
简述 最近项目中有关于第三方登陆的需求,第三方Facebook以及Google +登录. 正好这几天把这个需求做得差不多了,收个尾,作为一个这方面之前基本从未涉及的小白,总结下开发流程以及过程中遇到的 ...
- 第三方登录过程—OAuth2.0协议
---恢复内容开始--- 理清思路 1.在第三方注册成为开发者,拿到第三方给的client_id(app_id---就像你的身份证.QQ号)和client_secret(就像你的QQ密码): 2.填写 ...
随机推荐
- P9482 [NOI2023] 字符串
\(36pts\) \(O(tqn^2)\)暴力即可 \(40pts\) 对于最朴素的暴力优化,从头到尾扫,如果已经当前位字符比出优先级,那么直接能判断了,没必要往后跑了,第15个性质B的也给跑过了, ...
- rar终端常用命令
rar终端常用命令 1. 跳过目录: rar a xxx.rar -x./path_to_dir/ ./xxx/ [注] rar后面的文件夹不需要通配符 2. 加密码 rar a xxx.tar -p ...
- Linux 内核:设备驱动模型(6)设备资源管理
Linux 内核:设备驱动模型(6)设备资源管理 背景 不要总是用Linux 2.6的风格来写驱动代码了,也该与时俱进一下. 参考:http://www.wowotech.net/device_mod ...
- 『vulnhub系列』EVILBOX-ONE
『vulnhub系列』EVILBOX-ONE 下载地址: https://www.vulnhub.com/entry/evilbox-one,736/ 信息搜集: 使用nmap探测内网存活主机,发现开 ...
- C# pythonnet(3)_Butter-worth低通滤波
Python代码如下 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import ...
- 树莓派4B-GPIO控制舵机转动
树莓派4B-GPIO控制舵机转动 硬件需求: 树莓派 舵机 杜邦线 舵机 什么是舵机? 舵机(servomotor)是一种简化版本的伺服电机,是位置伺服的驱动器,能够通过输入PWM信号控制旋转角度,具 ...
- Oracle 启用、禁用触发器
基本语法 启用指定表中所有触发器(trigger) alter table table_name enable all triggers; 语法: alter table 表名 enable all ...
- CF372C
思路 根据题意可以得到dp转移方程是 \(f_{i,j}=\max\{f_{i-1,k}+b_i-|a_i-j|\}\) 而且 \(j-(t_{i}-t_{i-1})\times d\le k\le ...
- 接口防刷!利用redisson快速实现自定义限流注解
问题: 在日常开发中,一些重要的对外接口,需要加上访问频率限制,以免造成资��损失. 如登录接口,当用户使用手机号+验证码登录时,一般我们会生成6位数的随机验证码,并将验证码有效期设置为1-3分钟,如 ...
- Beizer。。。。。
<html> <head>AS</head> <script> var cvs; var context; //context.fill();//填充 ...