首页 > 其他分享 >Telegram第三方登录步骤

Telegram第三方登录步骤

时间:2024-08-19 18:37:30浏览次数:11  
标签:String 登录 Telegram 第三方 params user 哈希 dataMap name

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

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");

标签:String,登录,Telegram,第三方,params,user,哈希,dataMap,name
From: https://www.cnblogs.com/Go-Solo/p/18367728

相关文章

  • 华为账号“一键登录”能力让美团用户尽享安全便捷的登录体验
    背景随着全场景智能生态的日益完善,用户面临着众多应用与服务的登录需求,而繁琐的注册登录流程通常是用户转化的隐形障碍,用户可能因为步骤繁琐、记忆密码困难而中途放弃,导致应用错失潜在用户。其次,高门槛的登录方式增加了存量用户流失的风险,用户可能因为登录不便而减少应用使用频......
  • cnetos 9 安装巨坑!!! ssh无法登录
    不管任何软件登录或任何形式的ssh登录仅开启了密钥的登录没有账号密码具体步骤:找到合适的插入位置:在/etc/ssh/sshd_config文件中查找类似以下的段落,然后在附近添加新配置:#Authentication:#PermitRootLoginprohibit-password#PasswordAuthenticationno添加......
  • 7.ACS5.2 R1设备登录管理(本地)
    r1设备登陆管理(acs本地数据库)配置步骤r1上配置设备登陆管理(acs本地数据库):步骤一:基本登陆认证(用户:acsuser1属于组:acsgroup1)步骤二:exec级别授权(acsgroup1授权5级)步骤三:privilege本地命令授权(授权5级用户动态路由协议相关配置)步骤四:tacacs+命令授权(授权acsg......
  • 华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)
    关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务httpsecure-serverenablehttpserverenable2、Telnet服务telnetserverenable3、SSH服务stelnetserverenablesshuseradminauthentication-typepassword在V200R019C10以及之前的版本呢,都习惯的......
  • 登录 k8s-Dashboard 显示 Your connection is not private
    目录一、背景二、解决方案一、背景部署好kubernetes-Dashboard后使用master节点的ip+port登录Dashboard显示Yourconnectionisnotprivate无论是Edge还是GoogleChrome都是这样的情况二、解决方案点击网页空白处,英文输入法输入:thisisunsafe即可正常访问......
  • 用代码实现登录界面
    1、目标实际开发中,用代码实现QT的逻辑功能用的比较多希望掌握QT助手(QT的API文档)如何查询使用希望养成好的QT学习习惯和方法2、QT助手的打开方法方法一:在QT安装程序中,有个assistant,打开既是QT助手方法二:在QTcreator帮助3、代码实现登录的思路设置属性的成员方法都......
  • 【SQL】连续登录
    目录题目分析代码题目Table: Activity+--------------+---------+|ColumnName|Type|+--------------+---------+|player_id|int||device_id|int||event_date|date||games_played|int|+--------------+-------......
  • h5直播源码,用户登录流程及权限校验
    h5直播源码,用户登录流程及权限校验今天我们来看一下用户登录的流程前端部分 以一个后台管理系统登录为例:登录篇1.用户输入账号和密码点击登录传给服务器用户名和密码2.服务器验证成功后给客户端传递一个token,并且把这个token存在cookies中,这样下次再向服务器发请......
  • Debian修改了sshconfig之后仍无法root登录ssh
    1.检查/etc/ssh/sshd_config是否限制了登录session对话数等其他相关配置2.检查用户账户状态passwd-Sroot命令检查root用户的状态。假如返回:rootL03/28/20220999997-1rootL03/28/20220999997-1●L:表示密码被锁定。●03/28/2022:密码最后一次更改的......
  • [20240813]跟踪sqlplus登录执行了什么5(21c).txt
    [20240813]跟踪sqlplus登录执行了什么5(21c).txt--//跟踪看看sqlplus21c版本访问数据库21c时,在执行用户调用命令前执行一些什么sql语句。1.环境:[email protected]:1521/book>@prxx==============================PORT_STRING                  :x86_64/L......