Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 4246|回复: 0

使用淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站

  [复制链接]

该用户从未签到

发表于 2011-10-9 20:14:20 | 显示全部楼层 |阅读模式
登录实现流程:
此流程要求第三方网站的应用(以下简称“应用”)是有Server的Web应用,能够保存应用本身的密钥以及状态,可以通过https直接访问淘宝的授权服务器。

该流程分三个步骤:
第一步:通过用户授权获取授权码Code;
第二步:用上一步获取的Code和应用密钥(AppSecret)通过Https Post方式换取Token。
第三步:获取用户Nick或者其他信息

一、获取授权码Code应用在要求获取用户信息的时候,首先引导用户(Redirect)到登录授权页面https://oauth.taobao.com/authorize

需要传的参数有


名称
是否必需
描述
response_type
Y
此处为web应用,此值固定为code
client_id
Y
即创建应用时的Appkey
redirect_uri
Y
登录后的回调地址,(注意:此地址必须要与注册应用时的回调地址相匹配,匹配规则是:注域名完全匹配
state
N
该参数由应用定义,用户授权后,授权服务器会原封不动将此参数返回。
注: 应用可通过可选参数state来记录用户当前所处的页面位置信息,方便用户登录授权后,页面回调到用户之前所处的位置。

例如: https://oauth.taobao.com/authori ... .xx.org&state=1



用户登陆后,显示用户授权页面:


此时,用户可以选择“授权”或者“取消”(即不同意授权)。
如果用户同意授权,则跳转到应用的回调地址(redirect_uri),同时,应用获得授权码code


如果用户取消授权或者访问出错


二、用授权码Code换取Token应用在获取授权码后,发送Https Post到授权服务器,授权服务器验证授权码的合法性和应用的AppSecret,验证通过后授权服务器返回Access Token给应用。



需要传的参数有:


名称
是否必需
描述
grant_type
Y
授权类型 authorization_code 或者 refresh_token
code
Y
授权请求中的授权码,即第一步获取到的code
redirect_uri
Y
登录后的回调地址,(注意:此地址必须要与注册应用时的回调地址相匹配,匹配规则是:注域名完全匹配
client_id
Y
客户标识,即appkey
client_secret
Y
客户密钥,即appsecret


以下为java代码实现授权:

第一步:
在网站设置登陆入口
  1. <A class="g6" title=会员登录
  2.    href="https://oauth.taobao.com/authorize?client_id=12381144&response_type=code&state=1&redirect_uri=http://localhost:2011/WinTaobao/do.jsp" target="_blank">
  3.    登录</A>
复制代码
第二步,在redirect网站接受登录后返回的code,并获得access_token,使用淘宝api获取登陆的用户名,将此用户名设置到session中:
  1. if(request.getParameter("code") != null && !request.getParameter("code").equals("")){
  2.   String url ="https://oauth.taobao.com/token";
  3.   Map<String, String> props = new HashMap<String, String>();
  4.   props.put("grant_type","authorization_code");
  5.         props.put("code", request.getParameter("code"));
  6.         System.out.println(request.getParameter("code"));
  7.         props.put("client_id", "*appkey*");
  8.         props.put("client_secret", "*appsecret*");
  9.         props.put("redirect_uri", "http://localhost:2011/WinTaobao/do.jsp");
  10.          
  11.         String s = "";
  12.         try{
  13.          //WebUtils平台SDK封装
  14.          s = WebUtils.doPost(url, props, 30000, 30000);
  15.         }catch(IOException e){
  16.          e.printStackTrace();
  17.         }
  18.          
  19.         String access_token = "";
  20.         String nick="";
  21.         JSONObject jb;
  22.         System.out.println(s);
  23.         try{
  24.          //解析获取token
  25.          jb = new JSONObject(s);
  26.          //判断是否获取到token,若获取失败,可以根据返回的错误描述排查
  27.          if(!jb.has("error")){
  28.           access_token = jb.getString("access_token");
  29.           System.out.println("token:"+access_token);
  30.           //获取当前登录用户nick等数据,access_token就相当于sessionKey,后续调用其他接口可以直接使用
  31.           TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest","*appkey*","*appsecrect*");
  32.           UserGetRequest req = new UserGetRequest();
  33.            
  34.           req.setFields("user_id,uid,nick");
  35.                 UserGetResponse resp = client.execute(req,access_token);
  36.                 if(resp.isSuccess()){
  37.                  //获取nick
  38.                  nick = resp.getUser().getNick();
  39.                  session.setAttribute("nick",nick);
  40.                  response.sendRedirect(path+"/index.html");
  41.                 }
  42.          }
  43.         }catch(JSONException e){
  44.          e.printStackTrace();
  45.         }catch(ApiException e){
  46.          e.printStackTrace();
  47.         }      
  48.     }
  49.      
  50.     if(request.getParameter("error") != null && !request.getParameter("error").equals("")){
  51.        System.out.println(request.getParameter("error_description"));
  52.     }
复制代码
第三步,在返回的页面中获取session中的nick,也就代表网站已经登陆了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-10-9 20:33:37 | 显示全部楼层
    如此便可以使用淘宝账号登陆自己的应用了啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2011-10-24 21:17:55 | 显示全部楼层
    这个必须顶!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-3-15 15:59:37 | 显示全部楼层
    研究研究,很不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-4-27 22:22:05 | 显示全部楼层
    使用淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站 谢谢分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-6 09:46 , Processed in 0.382061 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表