LY码本录-实现登录授权

Administrator
发布于 2025-03-29 / 5 阅读
0
0

LY码本录-实现登录授权

LY码本录 实现登录授权

码本API

我们准备了一个案例,用于告知您如何使用 LY API 实现 三方登录授权功能!

目录

[TOC]

开始

我们现在就开始教大家如何调用 码本录 的登录授权嗷!

申请一个服务名称

服务名称是您的系统的一个标识,用于和其它系统区分开!您可以 点击这里 发送邮件给我们然后申请哦!

开始开发

开发逻辑非常简单,我们在这里准备了一个简单的例子!

引入码本API maven

        <dependency>
            <groupId>io.github.BeardedManZhao</groupId>
            <artifactId>CodeBookApi</artifactId>
            <version>1.13</version>
        </dependency>

开始开发控制器

package top.lingyuzhao.codeBookShop.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import top.lingyuzhao.codeBook.api.lyMbl.LyMblApi;
import top.lingyuzhao.codeBook.api.lyMbl.ThirdPartyAuth;

import java.io.UnsupportedEncodingException;
import java.util.UUID;

/**
 * 一个简易的测试控制器
 * @author 赵凌宇
 */
@Controller
@RestController
public class TestController {

    private String random;
    private final HttpClient httpClient;

    public TestController() {
        this.httpClient = HttpClients.createDefault();
    }

    // 这个是为了可以让系统能够正常接受这个对象,直接继承一下就好了,其它的不用做
    public static class ThirdAuth extends ThirdPartyAuth {

        public ThirdAuth(String systemUserID, String serviceProviderName, String thirdPartyUserID, String thirdPartyKey) {
            super(systemUserID, serviceProviderName, thirdPartyUserID, thirdPartyKey);
        }
    }

    /**
     * 在这模拟一个用户访问时需要登录的例子
     * @param httpServletRequest 请求对象
     * @param httpServletResponse 响应对象
     * @return 回复数据
     */
    @GetMapping("/home")
    @ResponseBody
    public String login(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
        // 查看会话中是否有第三方认证对象
        HttpSession session = httpServletRequest.getSession();
        if (session.getAttribute("thirdPartyAuth") != null) {
            System.out.println("用户已经登录了 在这里可以开始使用这个三方数据构建数据库中的用户信息");
            // 获取第三方认证对象
            ThirdPartyAuth thirdPartyAuth = (ThirdPartyAuth) session.getAttribute("thirdPartyAuth");
            // 获取到此认证对象所属用户在码本中的id
            System.out.println(thirdPartyAuth.getSystemUserID());
            // 获取三方用户ID 也就是当前系统可以使用的 id 和码本录可以分离,同一个码本账号的三方ID 是有固定值,但是却不同的
            System.out.println(thirdPartyAuth.getThirdPartyUserID());
            // 获取到三方密钥 也就是当前系统可以使用的 key 和码本录可以分离
            System.out.println(thirdPartyAuth.getThirdPartyKey());
            return "您好:" + thirdPartyAuth.getThirdPartyUserID();
        } else {
            System.out.println("用户还没有登录 在这里开始演示如何授权");
            // 首先准备一个随机值 作为回调地址的校验
            random = UUID.randomUUID().toString();
            // 调用码本API 构建一个授权链接 第一个参数是当前系统的标识符,第二个参数是授权成功后的回调地址
            String codeBook = LyMblApi.getLoginAuthorizationLink(
                    "codeBookAPI",
                    // 这个回调地址中 建议使用一个随机的值 作为校验
                    "http://localhost:8080/login/" + random
            );
            // 直接跳转
            httpServletResponse.setStatus(302);
            httpServletResponse.setHeader("Location", codeBook);
            return codeBook;
        }
    }

    @PostMapping("/login/{sk}")
    @ResponseBody
    public String test(HttpServletRequest httpServletRequest, @PathVariable("sk") String sk, ThirdAuth thirdPartyAuth) throws UnsupportedEncodingException {
        // 这里是回调地址,在这里我们可以直接将 sk 进行校验了,防止非法的请求
        if (sk == null || !sk.equals(random) || !LyMblApi.checkThirdPartyAuth(httpClient, thirdPartyAuth)){
            // 如果发现这个链接 和 上面链接 中的随机值 不一致,则直接返回非法请求
            return "非法请求";
        }
        // 校验通过之后 建议立刻将随机值失效
        random = null;
        // 然后我们就可以进行 thirdPartyAuth 的使用啦!在这里我们是直接将他们设置到 session 中
        System.out.println(httpServletRequest.getRequestURL());
        System.out.println(thirdPartyAuth);

        // 获取当前会话
        HttpSession session = httpServletRequest.getSession();
        // 设置会话的最大不活动时间为30分钟(1800秒)
        session.setMaxInactiveInterval(1800);
        // 将第三方认证对象存储在会话中
        session.setAttribute("thirdPartyAuth", thirdPartyAuth);

        return "授权成功了,您可以看看 home 页面是否有变化";
    }
}

测试

访问 http://localhost:8080/home 就可以出发授权了!

0ae42421d0e43e9c0c646552b7d7846f9156aa49d68903436d15021b6992a9ce

当授权操作成功,您应该会看到 test 控制器给您返回的 授权成功了,您可以看看 home 页面是否有变化 字符串!

5f92935d4f1733dac88e01b038bc5b158f80e71630c51dfe7a79a051bb57c4b6

这个时候,您再一次访问 http://localhost:8080/home 就可以看到,系统已经收到了您的身份信息!

9c744ba032af9fec384524938f18cdde9b63bd8b25548f93424e4db6c30b3282


评论