实现百度第三方登录(Android Studio)

对于第一次开发第三方登录的开发者而言,学习百度账号的第三方登录相对来说没有实现qq,微信那么繁琐,更适合初学者学习。

说明:实现百度第三方登录与实现qq的流程是一样的,只不过qq的申请为开发者认证比较麻烦。百度可直接申请为开发者。

具体流程:

通过实现三次握手来实现第三方登录;

1.登录到百度开发者中心。
2.注册百度账号,成为百度开发者。
3.需要把项目添加到开发者工程中。
4.在百度开发者中心创建工程。
4.安全设置
第一次握手:可在自己创建的工程中查看API文档需要如下几个参数

  • client_id:必须参数,注册应用时获得的API Key。
  • response_type:必须参数,此值固定为“code”。
  • redirect_uri:必须参数,授权后要回调的URI,即接收Authorization Code的URI。如果用户在授权过程中取消授权,会回调该URI,并在URI末尾附上error=access_denied参数。对于无Web Server的应用,其值可以是“oob”,此时用户同意授权后,授权服务会将Authorization Code直接显示在响应页面的页面中及页面title中。非“oob”值的redirect_uri按照如下规则进行匹配:
    https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect&scope=email&display=popu

登录页面:
<a href="http://openapi.baidu.com/oauth/2.0/authorize?client_id=API Key&response_type=code&redirect_uri=http://localhost:8090/project/loginSuccess">
      <button type="button" class="btn btn-danger">第三方百度登录</button></a>
最终实现:

点击跳转到自己项目专有的一个登录页面,登陆成功,跳转到自己的项目中。

(第一次握手只能获取到code码,获取不到用户信息)
把随机数code再次发送给百度,获取令牌Access_Token
第二次握手

通过Authorization Code获取Access Token

  • grant_type:必须参数,此值固定为“authorization_code”;
  • code:必须参数,通过上面第一步所获得的Authorization Code;
  • client_id:必须参数,应用的API Key;
  • client_secret:必须参数,'应用的Secret Key;
  • redirect_uri:必须参数,该值必须与获取Authorization Code时传递的“redirect_uri”保持一致。

例如:

https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn&client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect

controller层
    @RequestMapping("/loginSuccess")
    public String loginSuccess(String code,HttpServletRequest request){
        System.out.println(code);
        try {
            /* 第二次握手 */
            //把随机数code再次发送给百度,获取令牌Access_Token
            //通过httpClient向百度发送请求
            CloseableHttpClient httpClient = HttpClients.createDefault();
            //创建一个post请求
            HttpPost postReq = new HttpPost("https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code="+code+"&client_id=

Va5yQRHlA4Fq4eR3LT0vuXV4

&client_secret=

0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2

&redirect_uri=http://localhost:8090/project/loginSuccess");
            postReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    ");
            postReq.addHeader("Accept-Encoding", "gzip, deflate, br");
            postReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            postReq.addHeader("Connection", "keep-alive");
            postReq.addHeader("Host", "openapi.baidu.com");
            postReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0");
            //执行post请求
            CloseableHttpResponse response;
            
            response = httpClient.execute(postReq);
            //获取响应信息
            HttpEntity entity = response.getEntity();
            //把响应信息转换成字符串
            String content = EntityUtils.toString(entity,"UTF-8");
            System.out.println("第二次握手"+content);
            //转为json对象,调属性
            Baidu baidu = JSONObject.parseObject(content, Baidu.class);
            System.out.println("token令牌"+baidu.getAccess_token());
            /* 第三次握手 */
            //发送请求,获取用户信息,需要参数Token令牌(调用户信息接口)
//再将令牌Access_Token发送给百度,获取用户信息。
           HttpPost postReq2 = new HttpPost("https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser?access_token="+baidu.getAccess_token());
            
            postReq2.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    ");
            postReq2.addHeader("Accept-Encoding", "gzip, deflate, br");
            postReq2.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            postReq2.addHeader("Connection", "keep-alive");
            postReq2.addHeader("Host", "openapi.baidu.com");
            postReq2.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0");
            CloseableHttpResponse response2 = httpClient.execute(postReq2);
            HttpEntity entity2 = response2.getEntity();  
            String content2 = EntityUtils.toString(entity2,"UTF-8");
            System.out.println("第三次握手"+content2);
            //转为json对象,调属性
            BaiduUserInfo userInfo = JSONObject.parseObject(content2, BaiduUserInfo.class);
            System.out.println(userInfo.getUid());
            //判断这个用户的uid在数据库中是否存在,存在说明这个百度用户与数据库用户是绑定的
            User user = loginservice.checkedUserByUid(userInfo.getUid());//后台查询,返回user对象
            //然后判断,存在登录成功,不存在返回到登录页面
            if(user==null){
                return "redirect:index.jsp";
            }else{
                request.getSession().setAttribute("user", user);
                return "/WEB-INF/user/success";
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

第三方登录(百度账号登录)相关推荐

  1. OAuth2.0协议入门(一):OAuth2.0协议的基本概念以及使用授权码模式(authorization code)实现百度账号登录

    一 OAuth2.0协议的基本概念 (1)OAuth2.0协议 OAuth协议,是一种授权协议,不涉及具体的代码,只是表示一种约定的流程和规范.OAuth协议一般用于用户决定是否把自己在某个服务商上面 ...

  2. python 自动登录百度账号 by Dopamine

    # 自动登录百度账号 from selenium import webdriver import timebrowser = webdriver.Chrome() # 设置隐式等待 find等待查询, ...

  3. 解决PanDownload登录提示账号登录失败,获取bdstoken失败问题

    之前在这篇文章下的回答https://blog.csdn.net/weixin_43317534/article/details/106558533,受到很多人欢迎,近期(8月5号)原回答的方法已经失 ...

  4. python自动登录百度_python实现自动登录百度账号功能代码

    from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(10) dr ...

  5. 登陆失败bdstoken_解决PanDownload登录提示账号登录失败,获取bdstoken失败问题

    最近使用pandown,使用百度账号直接登录不上了,提示bdstoken获取失败,不管是新浪第三方登录,还是QQ第三方登录,都是这个提示,因此我找了好多办法,终于发现了一个大佬的解决办法,附上连接及步 ...

  6. 游戏游客登录与账号登录

    登录流程这一块,之前做功能没有接触到这一块,最近做登录踩了几个坑,下面来梳理一下: 我们这款app,之前是h5版的,在线上运营了大概一年,效果还比较好,但是h5版本的没有服务器,数据是采用云函数存储在 ...

  7. Python爬虫学习(五)Chrome浏览器自动化测试框架_使用百度账号、QQ第三方登陆百度账号

    简单介绍 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 安装第三方模块selenium pip in ...

  8. 账户登录失败获取bdstoken失败_解决PanDownload登录提示账号登录失败,获取bdstoken失败问题...

    最近使用pandown,使用百度账号直接登录不上了,提示bdstoken获取失败,不管是新浪第三方登录,还是QQ第三方登录,都是这个提示,因此我找了好多办法,终于发现了一个大佬的解决办法,附上连接及步 ...

  9. 美多商城项目之用户登录:账号登录、QQ登录

    一.账号登录 1.1 用户名登录 1. 用户名登录逻辑分析 2. 用户名登录接口设计 1.请求方式 选项 方案 请求方法 POST 请求地址 /login/ 2.请求参数:表单 参数名 类型 是否必传 ...

  10. 手机验证码登录,账号登录结合

    本项目基于腾讯外包框架(wei框架) 地址:https://github.com/twinh/wei/tree/master/docs/zh-CN#wei HTML页面: [基于bootstrap前端 ...

最新文章

  1. 用计算机采集卡检测压力传感器信号故障,计算机联网检测系统应用研究
  2. 火山引擎向企业客户开放上万款抖音同款特效
  3. php url映射,php – Laravel:将任意URL解析为相应的Controller / Route?
  4. jQuery选择器全集详解
  5. java 数组参数_java中 数组可以作为形式参数传递到调用的方法中吗?要怎么操作?...
  6. 从放弃迅雷和IDM到自己开发下载工具
  7. Ubuntu安装pycharm并且激活
  8. linux安装到内存中,Linux安装识别大内存的补丁程序
  9. Python“制作”midi音乐“两只老虎”
  10. 使用SQL Server数据库指标预测应用程序问题
  11. 科大讯飞携手华南理工,成立脑机接口公司,注册资本4000万
  12. Win2K8R2IIS7命令添加服务器角色
  13. 操作~拷贝clone()
  14. Axure RP9新手教程
  15. 在SQL 2014 Server上安装Northwind和Pubs示例数据库
  16. Win系统 - 笔记本电脑之耳机插入没声音
  17. pta 7-1 走楼梯升级版(递归)
  18. PHP正则过滤处理微信昵称中emoji字符的方法(导出excel)
  19. 现代医院智能化系统方案及其难点探讨
  20. Vmware Vtop基本使用

热门文章

  1. C++算法之排列算法
  2. RE写作Issue问题题库分析与提纲
  3. 关于Unable to read additional data from server sessionid 0x0问题的解决。
  4. 浅谈数字音频处理的新技术
  5. 垃圾分类数据集-8w张图片245个类附赠tensorflow代码
  6. cocos2dx 学习笔记之摄像头与3D精灵的移动
  7. 大三实习生,字节跳动面经分享,已拿Offer
  8. 5+API实现微信分享功能
  9. android art模式 开启,如何开启androidART模式
  10. 使用Natapp本地调试微信公众号H5