热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

原生java代码实现码云第三方验证登录的示例代码

这篇文章主要介绍了原生java代码实现码云第三方验证登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

码云第三方验证登录

研究了QQ,码云,微信等第三方登录接口时,发现QQ以及微信第一步都需要验证授权管理,而且个人测试需要提供手持身份证一张,并且验证时间过长( 3天工作日左右吧 ),这样会非常浪费大家学习第三方接口登录的时间,终于, 在我的不屑努力下,找到了适合大家快速上手,测试第三方接口登录的平台-————码云(看网上帖子说某WX接入还要开发者认证,人民币300元)
码云链接地址
https://gitee.com/

一、在码云上创建应用

1、在码云上注册一个账号,点击右上角设置

在这里插入图片描述

2、创建应用

在这里插入图片描述

3、填写资料

很多同学不太了解什么是应用回调地址webhooks(第三方登录成功后,会返回到你指定的地址,并且携带验证是否成功的参数信息)

在这里插入图片描述

4、获取到clientId以及client Secret

clientId和client Sercret的主要作用是通过拼接得到请求地址,将地址重定向至授权登录页面

在这里插入图片描述

在这里插入图片描述

准备过程已完成

二、在项目中实现第三方登录

大概流程

在这里插入图片描述

1、导入依赖jar包

   
	
      javax.servlet
      javax.servlet-api
      3.1.0
    
	
    
      me.zhyd.oauth
      JustAuth
      1.3.2
    
	
    
      org.apache.httpcomponents
      httpclient
      4.5.2
    

2、跳转授权页面

AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
        .clientId(CLIENT_ID) //Client ID
        .clientSecret(CLIENT_SECRET) //Client Secret
        .redirectUri(REDIRECTURI)   //回调地址
        .build());
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
//跳转到授权页面
response.sendRedirect(authorizeUrl);

3、通过回调地址获取到code值

//http://localhost:8080/login?actiOnName=giteeCode&code=e063730161cd40cf&state=25c74eba2ac5f 
String code = request.getParameter("code");

4、再将用户授权码发送码云服务器

补充一个小小的坑,码云第三方验证需要加上header信息,否则会报403错误

String url = "https://gitee.com/oauth/token?grant_type=authorization_code&code="+code+"&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECTURI+"&client_secret="+CLIENT_SECRET;
Map map = new HashMap<>();
map.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36)");
JSONObject s = HttpUtils.post(url,map);

授权登录失败会返回message错误信息,标识登录失败

成功:

{
"access_token":"e386e20327b7c4",
"refresh_token":"057c79c2d1f957a5cb4d",
"scope":"user_info",
"created_at":15488,
"token_type":"bearer",
"expires_in":86400
}

5、获取码云用户信息

通过授权码获取到的json数据,其中access_token参数,可以访问码云的用户数据

//https://gitee.com/api/v5/user&#63;access_token=*******
String access_token = s.getString("access_token");
String url2 = "https://gitee.com/api/v5/user&#63;access_token="+access_token;
JSONObject user = HttpUtils.get(url2,map);

//1、设置响应类型输出流
response.setContentType("application/json;charset=UTF-8");
//2、将json转为字符串
String str = JSON.toJSONString(user);
//3、得到字符输出流
response.getWriter().write(str);

源码:
在这小编要说一下回调地址操作1和回调地址操作2的区别
操作1:小编使用的是服务器的get,post发送请求,而跳转“授权页面”(giteeLogin 方法)使用的是插件,各位看主大大也可手动改为get请求,跳转第三方登录页面,具体get地址请参考
码云oauth文档
其中A和B步骤,修改后就可以不用插件代码跳转授权页面

操作2:完全使用的是JustAuth插件实现第三方登录

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.shsxt.utils.HttpUtils;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.request.AuthGiteeRequest;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersiOnUID= 1L;

    //ac85a173bb89ee
    private final String CLIENT_ID = “Client ID”
    private final String CLIENT_SECRET= “Client Secret”
    private final String REDIRECTURI = “回调地址”

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户行为
        String actiOnName= request.getParameter("actionName");
        //判断用户行为
        if("giteeLogin".equals(actionName)) {
            //如果发送码云授权验证
            giteeLogin(request,response);
        }else if("giteeCode".equals(actionName)) {
            //giteeCode(request,response);
           giteeCode2(request,response);
        }
        System.out.println("点击了");
    }

    /**
     * 回调地址后的操作1
     * @param request
     * @param response
     */
    private void giteeCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取code
        String code = request.getParameter("code");
        String url = "https://gitee.com/oauth/token&#63;grant_type=authorization_code&code="+code+"&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECTURI+"&client_secret="+CLIENT_SECRET;
        Map map = new HashMap<>();
        map.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36)");
        JSONObject s = HttpUtils.post(url,map);
        System.out.println(s);

        //https://gitee.com/api/v5/user&#63;access_token=*******
        String access_token = s.getString("access_token");
        String url2 = "https://gitee.com/api/v5/user&#63;access_token="+access_token;
        JSONObject user = HttpUtils.get(url2,map);
        //1、设置响应类型输出流
        response.setContentType("application/json;charset=UTF-8");
        //2、将json转为字符串
        String str = JSON.toJSONString(user);
        //3、得到字符输出流
        response.getWriter().write(str);
    }


    /**
     * 回调地址后的操作2
     * @param request
     * @param response
     */
    private void giteeCode2(HttpServletRequest request, HttpServletResponse response) throws IOException {
      String code = request.getParameter("code");

        AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
                .clientId(CLIENT_ID) //Client ID
                .clientSecret(CLIENT_SECRET) //Client Secret
                .redirectUri(REDIRECTURI)   //回调地址
                .build());

        AuthResponse json = authRequest.login(code);
        System.out.println(json);

    }


    /**
     * 跳转授权页面
     * @param request
     * @param response
     */
    private void giteeLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //跳转授权页面
        AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
                .clientId(CLIENT_ID) //Client ID
                .clientSecret(CLIENT_SECRET) //Client Secret
                .redirectUri(REDIRECTURI)   //回调地址
                .build());
        String authorizeUrl = authRequest.authorize();
        //跳转到授权页面
        response.sendRedirect(authorizeUrl);
    }
}

服务器发送get/post请求工具类

package com.shsxt.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Set;


public class HttpUtils {
    /*
     *发送简单post请求
     */
    public static JSONObject post(String url) {
        HttpPost post = new HttpPost(url);
        return getResult(post);
    }
    /*
     *发送带Header的post请求
     */
    public static JSONObject post(String url, Map map) {
        HttpPost post = new HttpPost(url);
        if (!map.isEmpty()) {
            Set> entrys = map.entrySet();
            for (Map.Entry entry : entrys) {
                post.setHeader(entry.getKey(), entry.getValue());
            }
        }
        return getResult(post);
    }
    /*
     *发送带Header的get请求
     */
    public static JSONObject get(String url, Map map) {
        HttpGet get = new HttpGet(url);
        if (!map.isEmpty()) {
            Set> entrys = map.entrySet();
            for (Map.Entry entry : entrys) {
                get.setHeader(entry.getKey(), entry.getValue());
            }
        }
        return getResult(get);

    }
    /*
     *发送简单的get请求
     */
    public static JSONObject get(String url) {
        HttpGet get = new HttpGet(url);
        return getResult(get);

    }
    /*
     *发送请求方法,请求响应为JSONObject
     */
    private static JSONObject getResult(HttpRequestBase requestBase) {
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String result = null;
        try {
            result = EntityUtils.toString(httpClient.execute(requestBase).getEntity());
            result = new String(result.getBytes("ISO-8859-1"),"utf-8");
            httpClient.close();
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            return new JSONObject(JSON.parseObject(result));
        }
    }
    /*
     *当请求响应为String时
     */
    public static String getString(String url) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet get = new HttpGet(url);
        String result = null;
        try {
            result = EntityUtils.toString(httpClient.execute(get).getEntity());
            httpClient.close();
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            return result;
        }
    }

}
```*当请求响应为String时
     */
    public static String getString(String url) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet get = new HttpGet(url);
        String result = null;
        try {
            result = EntityUtils.toString(httpClient.execute(get).getEntity());
            httpClient.close();
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            return result;
        }
    }
}

前端页面

在这里插入图片描述

总结

到此这篇关于原生java代码实现码云第三方验证登录的示例代码的文章就介绍到这了,更多相关java码云第三方验证登录内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • css元素可拖动,如何使用CSS禁止元素拖拽?
    一、用户行为三剑客以下3个CSS属性:user-select属性可以设置是否允许用户选择页面中的图文内容;user-modify属性可以设置是否允许输入 ... [详细]
  • Python爬取豆瓣数据实现过程解析
    这篇文章主要介绍了Python爬取豆瓣数据实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值, ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了正则表达式python相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 博主使用代理IP来自于网上免费提供高匿IP的这个网站用到的库frombs4importBeautifulSoupimportrandomimporturllib.re ... [详细]
  • 之前我曾经写过一篇关于CSS的border-image属性的文章。现在几乎所有的现代浏览器都支持这个属性——除了IE10及以下IE版本。看起来这是一个非常 ... [详细]
  • Material Design Lite ,简洁惊艳的前端工具箱。
    2019独角兽企业重金招聘Python工程师标准MaterialDesignLite简介本文主要介绍MaterialDesign设计语言的HTMLCSSJS部分实现。对应每一 ... [详细]
author-avatar
mobiledu2502890777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有