用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实现抖音授权登录,您需要使用抖音开放平台提供的API。以下是一个简单的Java代码示例,演示如何使用OAuth 2.0授权登录流程: 要使用Java实现抖音授权登录,您需要按照以下步骤进行操作: 创建抖音开放平台账号…...
Atlassian午餐会直播回顾:如何在Jira中进行项目时间与成本管理?
工时管理是项目过程管理的一个重要手段,通过科学记录项目组成员在项目执行过程中的任务完成和时间消耗情况,可以帮助管理者精准评估成员工作效率,实时掌握项目进展,并有效管控项目成本。 想要成为时间管理大师吗?在近…...
屏幕时代的数字化信息管理:从传统到纯软件的转变
随着数字化时代的推进,屏幕已经成为了企业和机构向外界传递信息的主要媒介。除了传统的手机和电脑屏幕,线下空间如办公楼、商场、店铺、医院、展厅等也需要利用屏幕来展示和发布各类信息。 管理这些屏幕和发布信息并不是一件容易的事情,特别是…...
Stm32_标准库_14_串口蓝牙模块_解决手机与蓝牙模块数据传输的不完整性
由手机向蓝牙模块传输时间信息,Stm32获取信息并将已存在信息修改为传入信息 测试代码: #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint16_t num…...
基于深度学习的“语义通信编解码技术”框架分类
目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] ,如图所示。语义提取神经网络的输入是原…...
信钰证券:股票抵押是好还是坏?
股票典当是指将持有的股票作为质押品向银行或其他金融机构融资的行为。股票典当有其优势和下风,下面咱们将从多个角度来剖析股票典当是否好仍是坏。 一、优势 1.占用资金少 相比较于其他融资办法,股票典当所需求占用的资金较少,只需将股票作…...
媒体基础:打开多模态大模型的新思路
编者按:2023年是微软亚洲研究院建院25周年。25年来,微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式,并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来,微软亚洲研究院致力于创造具有…...
dubbo-admin安装
一、dubbo-admin安装 1、环境准备 dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,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数据集: 二、 展示图片三、DataLoader数据加载器四、搭建神经网络五、 训练和测试第一次运行: 六、优化模型第二次优化后运行: 七、完整代码八、手写板实现输入识别功能 前言 注意…...
玩转代码| Vue 中 JSX 的特性,这一篇讲的明明白白
目录 什么时候使用JSX JSX在Vue2中的基本使用 配置 文本插值 条件与循环渲染 属性绑定 事件绑定 v-show与v-model 插槽 使用自定义组件 在method里返回JSX JSX是一种Javascript的语法扩展,即具备了Javascript的全部功能,同时又兼具html的语义…...
(vue)el-descriptions 描述列表无效
(vue)el-descriptions 描述列表无效 原因:element 的版本不够 解决:运行下面两个命令 npm uninstall element-ui //卸载之前安装的版本 npm i element-ui -S //重新安装解决参考:https://blog.csdn.net/weixin_59769148/article/details/1…...
ios 苹果手机日期格式问题
目录 问题解决其他 问题 ios 无法识别的时间戳格式:2023-10-17 11:10:49 可识别的: 2023/10/17 11:10:49 解决 const startTime 2023/10/17 11:10:49 startTime.replace(/-/g, /)// 获取时间差值 export const useDateDiff (startTime , endTime …...
学习嵌入式系统的推荐步骤:
学习嵌入式系统的推荐步骤: 00001. 选择一款Linux发行版作为主要操作系统,如RedHat、Ubuntu、Fedora等。进入Linux后,使用终端进行任务操作。建议不要使用虚拟机,如有需要可考虑双系统安装。 00002. 00003. 学习C语言、数…...
勒索病毒LockBit2.0 数据库(mysql与sqlsever)解锁恢复思路分享
0.前言 今天公司服务器中招LockBit2.0勒索病毒,损失惨重,全体加班了一天基本解决了部分问题,首先是丢失的文件数据就没法恢复了,这一块没有理睬,主要恢复的是两个数据库,一个是16GB大小的SQLserver数据库&…...
超简单小白攻略:如何利用黑群晖虚拟机和内网穿透实现公网访问
文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…...
Ubuntu 16.04 LTS third maintenance update release
Ubuntu 16.04 LTS (Xenial Xerus)今天迎来的第三个维护版本更新中,已经基于Linux Kernel 4.10内核,而且Mesa图形栈已经升级至17.0版本。Adam Conrad表示:“像此前LTS系列相似,16.04.3对那些使用更新硬件的用户带来了硬件优化。该版…...
Java学习_day01_hello java
构成 JDK JDK是java开发者工具,由JRE和一些开发工具组成。JRE JRE是java运行环境,由JVM和java核心类库组成。JVM JVM是java虚拟机,主要用来运行字节码。 执行过程 由IDE或文本编辑器,编写源代码,并将文件保存为*.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++内存管理:其五、指针类型转换与嵌入式指针
一、内存池的缺陷 作者在上一版本里面介绍了链表实现内存池,其中有一个小缺陷:虽然较少了cookie的内存损耗,但是加入了一个额外的指针,仍然需要占用内存。我们仔细看内存池的设计思想,可以发现一个关键点:…...
除了CAN总线,UDS协议还能跑在哪些车上?手把手带你用Wireshark抓包分析
突破CAN总线限制:UDS协议在多种车载网络中的实战解析 当提到UDS(Unified Diagnostic Services)诊断协议时,大多数工程师的第一反应是它与CAN总线的紧密关联。确实,在传统汽车电子架构中,UDS over CAN是最常…...
如何用20万条真实动作数据,终结机器人动作“脑补”
3月30日,某知名媒体报道了一项来自南洋理工大学的前沿技术突破。研究团队利用超过20万条“4D交互数据”结合“运动学锚定”,研发出一种新型的“生成式仿真”技术,有效解决了机器人动作模拟中长期存在的“脑补”难题。据悉,这一技术…...
搜索时代的命名战略:如何在亚马逊规避“品牌失语症”
在亚马逊这个由算法与关键词统治的商业世界里,一个名字的恰当与否,直接决定了品牌是“响亮宣言”还是“沉默失语”。许多名字如同《时代》或《财富》杂志,在传统语境中或许优雅,但在需要极致精准的数字货架上,却可能因…...
避坑指南:MTK DRM屏兼容中,那些容易让你“点不亮”的硬件与配置细节(附TP复位脚案例)
MTK DRM屏兼容开发实战:从硬件引脚到驱动配置的深度避坑指南 在MTK平台的多屏兼容开发中,工程师们常常会遇到屏幕"点不亮"的棘手问题。这类问题往往源于硬件连接、引脚配置或驱动编译选项中的细微疏忽。本文将结合真实案例,深入剖…...
深入解析振动传感器:从原理到应用的全面指南
1. 振动传感器入门:从"感觉"到"测量"的跨越 你有没有想过,为什么手机横屏时画面会自动旋转?为什么智能手环能记录你的步数?这些看似简单的功能背后,都离不开一个关键元件——振动传感器。作为工业…...
Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力
Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力 1. 引言:为什么选择这段30秒视频 今天我要带大家近距离观察Chord视频理解工具的实际表现。不同于传统的技术参数罗列,我们将通过一段精心挑选的30秒视频&#x…...
拒绝PPT运维!实测实在Agent:IT运维服务器监控与故障预警的“降维打击”
摘要: 在2024年IT运维体系全面迈向智能化(AIOps)的背景下,服务器监控与故障预警已不再是简单的指标采集,而是演变为对复杂业务逻辑与AI行为的深度感知。传统监控Agent(如Zabbix、Prometheus)虽稳…...
鲁棒估计与5点算法求解本质矩阵
发散,无法保证找到全局正确的解。鉴于5点算法的代数复杂性和实现难度(涉及高次多项式求根、病态方程处理等),并且考虑到本系列文章的核心主题是数值优化而非代数几何,我们在此不展开其繁琐的数学推导和代码实现细节。感…...
比迪丽WebUI保姆级教程:从服务器IP获取到首张图生成全过程
比迪丽WebUI保姆级教程:从服务器IP获取到首张图生成全过程 1. 前言:为什么选择比迪丽WebUI? 如果你对《龙珠》里的比迪丽(Videl)这个角色情有独钟,想用AI画出她的各种形象,那么今天这个教程就…...
51单片机实战:UART串口通信与数据交互优化
1. UART串口通信基础与51单片机实战价值 我第一次用51单片机做UART通信时,连波特率是什么都搞不清楚,结果电脑发过来的数据全是乱码。后来才发现是单片机定时器初值算错了,这个经历让我深刻理解到串口通信基础的重要性。 串口通信就像两个人用…...
