网上看到的不多,简单做个记录,本文主要对下面的文章做补充

Telegram(电报)授权登录(web)第三方

整体步骤为:

  1. 找 botFather 创建机器人
  2. 给机器人设置域名白名单,用于设置回调地址,官方回把用户信息返回此处,所以注意,域名需要能被 tg 官方调用到,像内网、国内 ip 等,是无法回调成功的;而且需要配置 https
  3. 去官方的 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第三方登录步骤的更多相关文章

  1. iOS - Share 分享/第三方登录

    1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...

  2. 第三方登录(QQ登录)开发流程详解

    原文:http://www.cnblogs.com/it-cen/p/4338202.html 近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑 ...

  3. 第三方登录 ----转载自简书,作者 <<碧霄问鼎>>

    这几天遇到一个需求:做第三方登录和分享.遇到了一些坑,把整个过程整理记录下来,方便他人,同时也捋一下思路. 当时考虑过把每个平台的SDK下载下来,一个一个弄,一番取舍后决定还是用ShareSDK.这里 ...

  4. QQ第三方登录

    QQ第三方登录 在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块.除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度.腾讯等开发者平台提供的第三方账号登录模块.最近研 ...

  5. CI框架 QQ接口(第三方登录接口PHP版)

    本帖内容较多,大部分都是源码,要修改的地方只有一个,其他只要复制过去,就可以完美运行.本帖主要针对CI框架,不用下载SDK,按我下面的步骤,建文件,复制代码就可以了.10分钟不要,接口就可完成.第一步 ...

  6. 开放平台-web实现人人网第三方登录

    应用场景     web应用通过人人网登录授权实现第三方登录.   操作步骤     1  注册成为人人网开放平台开发者         http://app.renren.com/developer ...

  7. 开放平台-web实现QQ第三方登录

    应用场景     web应用通过QQ登录授权实现第三方登录.   操作步骤     1  注册成为QQ互联平台开发者,http://connect.qq.com/     2  准备一个可访问的域名, ...

  8. 第三方登录开发-Facebook

    这次这个项目要分别可以使用新浪微博,qq互联以及Facebook和Twitter授权登录 facebook目前只支持oauth2技术,个人理解其工作流程是当用户想访问当前网站,却不想注册账号,此时当前 ...

  9. 关于Google+以及Facebook第三方登录实现的一点总结

    简述 最近项目中有关于第三方登陆的需求,第三方Facebook以及Google +登录. 正好这几天把这个需求做得差不多了,收个尾,作为一个这方面之前基本从未涉及的小白,总结下开发流程以及过程中遇到的 ...

  10. 第三方登录过程—OAuth2.0协议

    ---恢复内容开始--- 理清思路 1.在第三方注册成为开发者,拿到第三方给的client_id(app_id---就像你的身份证.QQ号)和client_secret(就像你的QQ密码): 2.填写 ...

随机推荐

  1. python重拾第十二天-sqlalchemy ORM

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping ...

  2. Android 自定义带动画的柱状图

    功能分析 假设要使用柱状图展示用户一周的数据,通用的做法是对接三方图表SDK或者自己通过代码绘制. 1.三方SDK通常包体较大,且定制性差,对特定的UI需求兼容性差; 2.自己绘制,比较复杂,而且要考 ...

  3. selenium的各种操作

    import time from selenium.webdriver import Edge from selenium.webdriver.common.by import By from sel ...

  4. python基础-数据容器的通用操作

    五种数据容器的特性   列表list[]  元组tuple()  字符串str""   集合set{}   字典dict{key:value} 元素数量 支持多个 支持多个 支持多 ...

  5. 【经验分享】全志科技官方Ubuntu16.04根文件系统镜像的替换和测试方法

     本文主要基于全志A40i开发板--TLA40i-EVM,一款基于全志科技A40i处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,演示Ubuntu根文件系统镜像的替换和测试方法. 创 ...

  6. LitCTF 2023 部分wp

    LitCTF 2023 PWN 只需要nc一下~ 根目录下的是假flag,真的在环境变量里 口算题卡 简单的计算题 import pwn io = pwn.remote("node5.ann ...

  7. MySQL执行过程及执行顺序

    一.MySQL执行过程 简单概括: 1.我们在客户端发起一个SQL的查询: 2.连接器判断用户登录以及用户权限: 3.缓存命中,走缓存,直接返回查询结果: 3.缓存没命中,到达分析器,对SQL语句进行 ...

  8. Vue 怎么用 vm.$set() 解决对象新增属性不能响应的问题 ?

    受现代 JavaScript 的限制 ,Vue 无法检测到对象属性的添加或删除.由于 Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 ...

  9. Masked Popcount 题解

    背景 罚了一发,太菜了.为什么我终于有时间的时候她要考试? 题意 给你 \(n,m\),问 \(\sum_{i=0}^{n}popcount(i \&m)\). 其中 \(\&\) 代 ...

  10. [rCore学习笔记 05]第0章作业题

    作业1 略. 作业2 C语言程序 gcc编译 gcc -o main main.c 编译报错 成功产生异常 main.c: In function 'main': main.c:5:26: warni ...