当前位置: 首页 > news >正文

用java实现抖音授权登录

要使用Java实现抖音授权登录,您需要使用抖音开放平台提供的API。以下是一个简单的Java代码示例,演示如何使用OAuth 2.0授权登录流程:

要使用Java实现抖音授权登录,您需要按照以下步骤进行操作:

创建抖音开放平台账号
首先,您需要在抖音开放平台上注册并创建一个账号。创建账号后,您需要创建一个应用并获取该应用的客户端ID和回调URL。

导入相关依赖
为了实现抖音授权登录,您需要使用Java OAuth API和Java HttpURLConnection。您可以通过Maven或Gradle等构建工具导入相关依赖。

构造请求参数
在进行授权登录时,您需要构造以下请求参数:

client_id:抖音开放平台分配的客户端ID
redirect_uri:授权成功后的跳转地址
response_type:授权类型,一般为code
scope:授权范围,一般为openid和userinfo
state:用于保持请求和回调的状态,您可以在授权成功后的回调中将其返回给前端
发送授权请求
使用Java HttpURLConnection构造POST请求,将构造好的请求参数发送到抖音开放平台的授权请求URL。请求完成后,您将获得一个包含code的响应。

获取用户信息
使用获取到的code和您的客户端ID,通过Java OAuth API构造访问令牌(Access Token)请求。成功获取Access Token后,您可以请求获取用户信息。您可以通过Java OAuth API构造请求参数,发送请求并解析响应数据。

跳转至抖音客户端
最后,您需要将用户重定向到抖音客户端。在跳转之前,您可以设置一些用户参数,以便在抖音客户端中展示个性化页面。

在实际开发过程中,以上步骤只是整个授权登录流程的一部分。您还需要考虑如何处理授权回调、如何存储和管理用户的访问令牌、如何处理错误等等。因此,建议您仔细阅读抖音开放平台的开发文档,并根据实际情况进行开发。


package com.zbkj.front.service.impl;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zbkj.common.model.user.User;
import com.zbkj.common.response.CommonResult;
import com.zbkj.front.util.DyUtil;
import com.zbkj.front.util.HttpKit;
import com.zbkj.front.util.HttpsUtil;
import com.zbkj.front.vo.DyLoginVo;
import com.zbkj.service.dao.UserDao;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;import javax.annotation.Resource;
import java.util.*;/**
* IndexServiceImpl 接口实现*/
@Service
public class TiktokServiceImpl {private static final Logger logger = LoggerFactory.getLogger(TiktokServiceImpl.class);public final static Map<String, String> btyeDanceTypeApi = new HashMap<String, String>();/*** 验证扫码是否成功*/public static final String CHECK_QRCONNECT_URL = "https://e.douyin.com/passport/web/check_qrconnect/?next=https:%2F%2Fe.douyin.com%2Fsite%2F&aid=1575";static {// 抖音授权btyeDanceTypeApi.put("dy", "https://open.douyin.com/");// 头条授权btyeDanceTypeApi.put("tt", "https://open.snssdk.com/");// 西瓜视频btyeDanceTypeApi.put("xg", "https://open-api.ixigua.com/");}// 此处我将需要的参数配置在了配置文件中,大家也可以直接写死@Value("${dibao.tiktok.redirectUri}")private String redirectUri;@Value("${dibao.tiktok.client_key}")private String client_key;@Value("${dibao.tiktok.client_secret}")private String client_secret;@Resourceprivate UserDao userDao;private static final String AUTHORIZE_URL = "https://open.douyin.com/platform/oauth/connect";public String geTiktokLink() {// 构造授权请求参数Map<String, String> params = new HashMap<>();params.put("redirect_uri", redirectUri);params.put("client_key", client_key);params.put("response_type", "code");params.put("scope", "user_info,trial.whitelist");params.put("state", UUID.randomUUID().toString().replace("-", ""));StringBuilder urlBuilder = new StringBuilder(AUTHORIZE_URL);urlBuilder.append("?");for (Map.Entry<String, String> param : params.entrySet()) {urlBuilder.append(param.getKey()).append("=").append(param.getValue()).append("&");}urlBuilder.deleteCharAt(urlBuilder.length() - 1); //return  urlBuilder.toString();}public CommonResult oauthTiktok(String code) {
//        String code = request.getHeaders("code"); // 获取之前存储的 code 参数DyLoginVo dyLoginVo=new DyLoginVo();dyLoginVo.setCode(code);dyLoginVo.setBtyeDanceType("dy");return   loginForDy(dyLoginVo);}/*** 抖音授权登录* @param vo* @return*/public CommonResult loginForDy(DyLoginVo vo) {if (StringUtils.isEmpty(vo.getCode())) {return CommonResult.failed("code 不能为空");}/*** 获取用户基本信息*/Map<String, String> param = new HashMap<>();param.put("client_key", client_key);param.put("client_secret", client_secret);param.put("code", vo.getCode());param.put("grant_type", "authorization_code");String baseDataStr = HttpKit.sendGet(btyeDanceTypeApi.get(vo.getBtyeDanceType()) + "oauth/access_token", param);JSONObject baseDataObject = JSON.parseObject(baseDataStr);if (baseDataObject.get("data") == null) {logger.info("获取字节用户基本信息异常 req => {} , res => {}", JSON.toJSONString(param), baseDataStr);return CommonResult.failed("获取用户信息失败");}JSONObject baseData = baseDataObject.getJSONObject("data");if (baseData.get("open_id") == null) {logger.info("获取字节用户基本信息异常 req => {} , res => {}", JSON.toJSONString(param), baseDataStr);return CommonResult.failed("获取用户信息失败");}String openId = baseData.get("open_id").toString();String accessToken = baseData.get("access_token").toString();//        // 此刻可以判断用户是否存在, 可注册
//        User user = userDao.getUserByOpenId(openId);
//        if (Objects.nonNull(user)) {
            return  check(vo.getCode());
//            // 存在, 组装返回信息
//            return CommonResult.success(accessToken);
//        } else {// 不存在, 获取用户公开信息param.clear();param.put("open_id", openId);param.put("access_token", accessToken);String publicDataStr = HttpKit.sendGet(btyeDanceTypeApi.get(vo.getBtyeDanceType()) + "oauth/userinfo", param);JSONObject publicDataObject = JSON.parseObject(publicDataStr);JSONObject data = publicDataObject.getJSONObject("data");/**data => {"avatar": "https://example.com/x.jpeg","city": "上海","country": "中国","description": "","e_account_role": "<nil>","error_code": "0","gender": "<nil>","nickname": "张伟","open_id": "0da22181-d833-447f-995f-1beefea5bef3","province": "上海","union_id": "1ad4e099-4a0c-47d1-a410-bffb4f2f64a4"}*/
//            User member = new User();
//            member.setCreateTime(new Date());
//            member.setUpdateTime(new Date());
//            member.setSex(Integer.parseInt(data.getString("gender")));
//            member.setNickname(data.getString("nickname"));
//
//            if (!StringUtils.isEmpty(vo.getEncryptedMobile())) {
//                try {
//                    member.setPhone(DyUtil.getMobile(client_secret, vo.getEncryptedMobile()));
//                } catch (Exception e) {
//                    return CommonResult.failed("手机号解密失败!");
//                }
//            }
//            member.setOpenId(openId);
//            // 头像
//            member.setAvatar(data.getString("avatar"));
//            member.setUserType("dy");
//            userDao.insert(member);return CommonResult.success(data);
//        }}public static void main(String[] args) {check("act.3.LXyHk5yavsm-nJgbnxgYwRub3n3KsXBTLwFoqxLcE_2pg469iOOk4JgGiheqbDxGWHzCoss-i2y3JriwlGq3RRvh1cUEXYpA_bxHzRagX-oyonc3bfDm1U9Dvn8nWAeGfjbGNVhm1ac3Lxfe8tfSZr8F3Diw3JXmoTEwO34ZyAXedddaujUjr_O0CoE=");}/*** 扫码是否成功* @param token* @return*/public static CommonResult check(String token){Map<String, String> param = new HashMap<>();JSONObject jsonObject = HttpsUtil.urlGet(CHECK_QRCONNECT_URL + String.format("&token=%s", token), null, null, true);JSONObject data = jsonObject.getJSONObject("data");if (data == null) {return CommonResult.failed("");}//获取headerJSONObject headerJson = jsonObject.getJSONObject("header");//获取Set-CookieList<String> lists = JSONObject.parseArray(headerJson.getJSONArray("Set-Cookie").toJSONString(), String.class);lists = lists.stream().map(v -> v.split(";")[0]).collect(Collectors.toList());String cookie = StringUtils.join(lists, ";");return CommonResult.success(cookie);// TODO: 拿到Cookie处理自己的登录流程...}}

相关文章:

用java实现抖音授权登录

要使用Java实现抖音授权登录&#xff0c;您需要使用抖音开放平台提供的API。以下是一个简单的Java代码示例&#xff0c;演示如何使用OAuth 2.0授权登录流程&#xff1a; 要使用Java实现抖音授权登录&#xff0c;您需要按照以下步骤进行操作&#xff1a; 创建抖音开放平台账号…...

Atlassian午餐会直播回顾:如何在Jira中进行项目时间与成本管理?

工时管理是项目过程管理的一个重要手段&#xff0c;通过科学记录项目组成员在项目执行过程中的任务完成和时间消耗情况&#xff0c;可以帮助管理者精准评估成员工作效率&#xff0c;实时掌握项目进展&#xff0c;并有效管控项目成本。 想要成为时间管理大师吗&#xff1f;在近…...

屏幕时代的数字化信息管理:从传统到纯软件的转变

随着数字化时代的推进&#xff0c;屏幕已经成为了企业和机构向外界传递信息的主要媒介。除了传统的手机和电脑屏幕&#xff0c;线下空间如办公楼、商场、店铺、医院、展厅等也需要利用屏幕来展示和发布各类信息。 管理这些屏幕和发布信息并不是一件容易的事情&#xff0c;特别是…...

Stm32_标准库_14_串口蓝牙模块_解决手机与蓝牙模块数据传输的不完整性

由手机向蓝牙模块传输时间信息&#xff0c;Stm32获取信息并将已存在信息修改为传入信息 测试代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint16_t num…...

基于深度学习的“语义通信编解码技术”框架分类

目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] &#xff0c;如图所示。语义提取神经网络的输入是原…...

信钰证券:股票抵押是好还是坏?

股票典当是指将持有的股票作为质押品向银行或其他金融机构融资的行为。股票典当有其优势和下风&#xff0c;下面咱们将从多个角度来剖析股票典当是否好仍是坏。 一、优势 1.占用资金少 相比较于其他融资办法&#xff0c;股票典当所需求占用的资金较少&#xff0c;只需将股票作…...

媒体基础:打开多模态大模型的新思路

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。25年来&#xff0c;微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式&#xff0c;并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来&#xff0c;微软亚洲研究院致力于创造具有…...

dubbo-admin安装

一、dubbo-admin安装 1、环境准备 dubbo-admin 是一个前后端分离的项目。前端使用vue&#xff0c;后端使用springboot&#xff0c;安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk&#xff0c;maven&#xff0c;nodejs 安装no…...

Kaggle - LLM Science Exam(三):Wikipedia RAG

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、 [EDA, Data gathering] LLM-SE ~ Wiki STEM | 1k DS2.1 Data overview2.2 Data gathering 三、如何高效收集数据3.1 概述3.2 与训练数据关联的维基百科类别…...

【机器学习】PyTorch-MNIST-手写字识别

文章目录 前言完成效果一、下载数据集手动下载代码下载MNIST数据集&#xff1a; 二、 展示图片三、DataLoader数据加载器四、搭建神经网络五、 训练和测试第一次运行&#xff1a; 六、优化模型第二次优化后运行&#xff1a; 七、完整代码八、手写板实现输入识别功能 前言 注意…...

玩转代码| Vue 中 JSX 的特性,这一篇讲的明明白白

目录 什么时候使用JSX JSX在Vue2中的基本使用 配置 文本插值 条件与循环渲染 属性绑定 事件绑定 v-show与v-model 插槽 使用自定义组件 在method里返回JSX JSX是一种Javascript的语法扩展&#xff0c;即具备了Javascript的全部功能&#xff0c;同时又兼具html的语义…...

(vue)el-descriptions 描述列表无效

(vue)el-descriptions 描述列表无效 原因&#xff1a;element 的版本不够 解决&#xff1a;运行下面两个命令 npm uninstall element-ui //卸载之前安装的版本 npm i element-ui -S //重新安装解决参考&#xff1a;https://blog.csdn.net/weixin_59769148/article/details/1…...

ios 苹果手机日期格式问题

目录 问题解决其他 问题 ios 无法识别的时间戳格式&#xff1a;2023-10-17 11:10:49 可识别的&#xff1a; 2023/10/17 11:10:49 解决 const startTime 2023/10/17 11:10:49 startTime.replace(/-/g, /)// 获取时间差值 export const useDateDiff (startTime , endTime …...

学习嵌入式系统的推荐步骤:

学习嵌入式系统的推荐步骤&#xff1a; 00001. 选择一款Linux发行版作为主要操作系统&#xff0c;如RedHat、Ubuntu、Fedora等。进入Linux后&#xff0c;使用终端进行任务操作。建议不要使用虚拟机&#xff0c;如有需要可考虑双系统安装。 00002. 00003. 学习C语言、数…...

勒索病毒LockBit2.0 数据库(mysql与sqlsever)解锁恢复思路分享

0.前言 今天公司服务器中招LockBit2.0勒索病毒&#xff0c;损失惨重&#xff0c;全体加班了一天基本解决了部分问题&#xff0c;首先是丢失的文件数据就没法恢复了&#xff0c;这一块没有理睬&#xff0c;主要恢复的是两个数据库&#xff0c;一个是16GB大小的SQLserver数据库&…...

超简单小白攻略:如何利用黑群晖虚拟机和内网穿透实现公网访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…...

Ubuntu 16.04 LTS third maintenance update release

Ubuntu 16.04 LTS (Xenial Xerus)今天迎来的第三个维护版本更新中&#xff0c;已经基于Linux Kernel 4.10内核&#xff0c;而且Mesa图形栈已经升级至17.0版本。Adam Conrad表示&#xff1a;“像此前LTS系列相似&#xff0c;16.04.3对那些使用更新硬件的用户带来了硬件优化。该版…...

Java学习_day01_hello java

构成 JDK JDK是java开发者工具&#xff0c;由JRE和一些开发工具组成。JRE JRE是java运行环境&#xff0c;由JVM和java核心类库组成。JVM JVM是java虚拟机&#xff0c;主要用来运行字节码。 执行过程 由IDE或文本编辑器&#xff0c;编写源代码&#xff0c;并将文件保存为*.ja…...

UnitTesting 单元测试

1. 测试分为两种及详细介绍测试书籍: 1.1 Unit Test : 单元测试 - test the business logic in your app : 测试应用中的业务逻辑 1.2 UI Test : 界面测试 - test the UI of your app : 测试应用中的界面 1.3 测试书籍网址:《Testing Swift》 https://www.hackingwithswift.c…...

C++内存管理:其五、指针类型转换与嵌入式指针

一、内存池的缺陷 作者在上一版本里面介绍了链表实现内存池&#xff0c;其中有一个小缺陷&#xff1a;虽然较少了cookie的内存损耗&#xff0c;但是加入了一个额外的指针&#xff0c;仍然需要占用内存。我们仔细看内存池的设计思想&#xff0c;可以发现一个关键点&#xff1a;…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...