Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录

2024-04-24 15:44

本文主要是介绍Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先说我遇到的问题,我按照流程接入了 telegram 登录小部件,在 PC 或者 H5 可以拿到数据(不管是选择回调函数还是回调地址的形式都可以),但是在 telegram mini app 中登录拿不到数据,在 telegram 中 我点击登录的小部件后是在浏览器中打开授权网址,然后授权后回调也是在浏览器中打开一个新标签页,而不是在 telegram 中打开

设置机器人域名

这里我假设你已经有一个机器人了(没有的网上有很多 文章 教怎么创建机器人),在 @BotFather 中输入 /myapps

image.png

image.png

点击 Edit Web App Url 后输入你的域名地址(这里也可以输入你的开发地址,以 https 开头,但是不能使用 登录小部件 因为你的网址和 telegram-widget.js 生成的 iframe 域名不一致会导致浏览器安全策略问题)

然后再输入 /setdomain, 同样的选择你的机器人然后输入你的网址

image.png

到这一步前置条件已完成。

登录

第一步

设置回调函数

// ...<Scriptid="get-telegramAuth"dangerouslySetInnerHTML={{__html: `function onTelegramAuth(user) {console.log('user =>>>', user)alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')');}
`,}}></Script>
// ...

第二步

这里我是使用 Next 框架编写的代码,在只需要改一下格式在其他框架中也可以使用。

import Script from 'next/script';
export const TGLogin = () => {return <><Script async src='https://telegram.org/js/telegram-widget.js?22' data-telegram-login='<你的机器人用户名>' data-request-access='write' data-size='large' data-radius='10' data-onauth='onTelegramAuth(user)'></Script><div id="my-special-div" onClick={() => {window.location.href = 'https://oauth.telegram.org/auth?bot_id=6889929762&origin=https%3A%2F%2Fwww.telegramloveai.com&embed=1&request_access=write&return_to=https%3A%2F%2Fwww.telegramloveai.com%2Fen%2Flogin'}}>LOGIN</div></>;
};

href 中地址是点击登录小部件进入新标签页的地址

image.png

机器人用户名不需要 @

image.png

Mini Apps 成功示例

image.png

静默登录

引入 js 文件 TG 文档 。

'/api/tg-login' 接口是我自己定义的,里面处理校验数据等逻辑。

'use client';import Script from 'next/script';
import { toast } from 'sonner';export const TGInitScript = () => {let initData = '';const TGWebAppReady = () => {const WebApp = window.Telegram.WebApp;/*** 静默登录*/if (WebApp.initDataUnsafe.user) {console.log(WebApp.initDataUnsafe);initData = `query_id=${WebApp.initDataUnsafe.query_id}&user=${encodeURIComponent(JSON.stringify(WebApp.initDataUnsafe.user))}&auth_date=${WebApp.initDataUnsafe.auth_date}&hash=${WebApp.initDataUnsafe.hash}`;const sendRequest = async () => {try {const { result, code, message } = await (await fetch('/api/tg-login', {method: 'POST',body: JSON.stringify({ initData }),})).json();if (code != '200') {throw new Error(message);}} catch (err: any) {toast(err.message);}};sendRequest();}};return (<><Scriptsrc="https://telegram.org/js/telegram-web-app.js"onReady={TGWebAppReady}></Script></>);
};

api 文件代码

import { NextRequest } from 'next/server';
import { validate } from './check';
import axios from 'axios';const handle = async (req: NextRequest) => {const body = await req.json();const BaseUrl ='';try {// 验证数据完整性validate(body.initData, process.env.NEXT_PUBLIC_TOKEN!);const searchParams = new URLSearchParams(body.initData);const user = JSON.parse(searchParams.get('user')!);// 和后端接口进行交互const { data: ApiData } = await axios(BaseUrl + '/authLogin',{method: 'POST',data: {loginType: 'telegram-mini-apps',email: '',nickname:user.first_name + (user.last_name ? ' ' + user.last_name : ''),openId: user.id,avatarUrl: user.photo_url,loginName: user.username,},});return Response.json(ApiData, {status: 200,});} catch (error: any) {return Response.json({code: '500',message: error.message || '',},{ status: 500 });}
};
export { handle as POST };

check 文件代码是复制的 tma.js 仓库中 文件数据 validate.ts

这篇关于Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932146

相关文章

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

90%的人第一步就错了! 顺利登录wifi路由器后台的技巧

《90%的人第一步就错了!顺利登录wifi路由器后台的技巧》登录Wi-Fi路由器,其实就是进入它的后台管理页面,很多朋友不知道该怎么进入路由器后台设置,感兴趣的朋友可以花3分钟了解一下... 你是不是也遇到过这种情况:家里网速突然变慢、想改WiFi密码却不知道从哪进路由器、新装宽带后完全不知道怎么设置?别慌

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Spring Security重写AuthenticationManager实现账号密码登录或者手机号码登录

《SpringSecurity重写AuthenticationManager实现账号密码登录或者手机号码登录》本文主要介绍了SpringSecurity重写AuthenticationManage... 目录一、创建自定义认证提供者CustomAuthenticationProvider二、创建认证业务Us

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2