用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;


    @Resource
    private 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("");
        }

        //获取header
        JSONObject headerJson = jsonObject.getJSONObject("header");
        //获取Set-Cookie
        List<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处理自己的登录流程...
    }

}


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值