当前位置: 首页 > 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;…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...