zoukankan      html  css  js  c++  java
  • php 整合 微博登录

    现在很多网站都整合了便捷的第三方登录,如QQ登录、新浪微博、搜狐、网易等,为用户提供不少方便和节约时间。我们可以选择使用JS或SDK实现第三方提供用户授权API,本文主要讲解 JAVA SDK 新浪微博登录授权以及获取用户资料。

    注:本例子使用的是 SpringMVC,所以若想拷贝代码直接使用则需自己提前搭建好环境。

    1、首先申请新浪微博网站接入:http://open.weibo.com/wiki/

    2、成为开发者得到App Key和App Secret

    3、下载weibo4j-oauth2:http://code.google.com/p/weibo4j/downloads/list

    4、编写获取用户信息代码,搞定!

    下载解压后,将src目录下weibo4j文件夹以及config.properties拷贝至自己 JAVA WEB 项目的src目录下。

    编辑config.properties配置文件,改成成自己的资料。第一个填写你申请的App Key值,第二个填写App Secret值。

    1
    2
    3
    client_ID =     
    client_SERCRET =
    redirect_URI =

    第三个redirect_URI,是你的重定向后的网址。应该对应一个控制器(Spring Controller)或 Servlet。在这里我们需要两个网址,第一个网址即用户在页面上点击的网址,能跳转到新浪微博账号登录界面,当用户点击账号登陆界面的登录按钮时,新浪微博会去校验资料正确性,一旦资料正确将会以 get 方式请求并且携带参数code重定向到你填写的redirect_URI,此时就能获取用户的资料了。

    以小明博客为例,首先用户点击 http://www.bugxm.com/user/login-sian-weibo.html,我们接收请求后主要工作是重定向到新浪微博登录页面。代码片段如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        /**
         * 
         * 新浪微博登录界面
         * 
         * @param session
         *  @return
         * @throws WeiboException
         */
        @RequestMapping(value = "/user/login-sian-weibo.html", method = RequestMethod.GET)
        public String loginSinaWeibo(HttpServletRequest request, HttpSession session)
                throws WeiboException {
            session.setAttribute("login_current_url", request.getHeader("Referer"));
            weibo4j.Oauth oauth = new weibo4j.Oauth();
            String url = oauth.authorize("code", "");
            return "redirect:" + url;
        }

    代码片段中的session是为了获取用户登录前所在页面URL,方便登录完后重定向到登录之前的页面。其中url是新浪微博登录界面网址,我们只需要重定向过去就行了。

    当用户在新浪微博登录成功后,会重定向到我们刚才填写的redirect_URI中,如我填写的 http://www.bugxm.com/user/login-sina-weibo.do,对应逻辑代码片段如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        /**
         * 
         * 新浪微博登录操作
         * 
         * @param session
         *  @return
         * @throws WeiboException
         */
        @RequestMapping(value = "/user/login-sina-weibo.do", method = RequestMethod.GET)
        public String loginSinaWeiboAction(HttpSession session,
                @RequestParam String code) throws WeiboException {
            String url = (String) session.getAttribute("login_current_url");
            session.removeAttribute("login_current_url");
            User user = userService.sinaWeiboLoginAction(code,
                    (User) session.getAttribute("user"));
            if (null != user) {
                session.setAttribute("user", user);
            }
            return "redirect:" + url;
        }

    重定向过来会携带code参数我们把值取到用来获取用户的资料。本段代码中的除code、sinaWeiboLoginAction()外都是次要,对本文主题而言可有可无。我们来看看sinaWeiboLoginAction()代码片段:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /**
         * 新浪微博操作
         * 
         * @param code
         * @param currentLoginUser
         *            当前登录用户,可为 null
         *  @return
         * @throws WeiboException
         */
        public User sinaWeiboLoginAction(String code, User currentLoginUser)
                throws WeiboException {
            weibo4j.Oauth oauth = new weibo4j.Oauth();
            weibo4j.http.AccessToken accessToken = oauth.getAccessTokenByCode(code);
            String uid = accessToken.getUserUid();
     
            weibo4j.Users users = new weibo4j.Users();
            users.client.setToken(accessToken.getAccessToken());
            weibo4j.model.User user = users.showUserById(uid);
     
            String userDomain = user.getUserDomain(); // 用户登录名
            String username = user.getScreenName(); // 用户呢称
            String avatar = user.getAvatarLarge(); // 用户头像
            String gender = null; // 性别
            if ("m".equals(user.getGender())) {
                gender = "男";
            } else if ("f".equals(user.getGender())) {
                gender = "女";
            } else {
                gender = "未知";
            }
     
            // …… 业务逻辑操作,代码略
            return currentLoginUser;
        }

    其中String uid = accessToken.getUserUid();的getUserUid()方法本身是没有的,我们需要修改新浪微博的源代码,不然取uid非常麻烦。

    编辑/src/weibo4j.http/AccessToken.java,在:

    1
    2
    3
    public String getRefreshToken() {
        return refreshToken;
    }

    下面添加:

    1
    2
    3
    public String getUserUid() {
        return uid;
    }

    到此就搞定了。用户的其它资料已经很详细的注释在/src/weibo4j/model/User.java中了。

  • 相关阅读:
    DotNetty网络通信框架学习之初识Netty
    DotNetty网络通信框架学习
    DotNetty网络通信框架学习之源码分析
    MODBUS协议解析中常用的转换帮助类(C#)
    C# 键盘钩子
    C# 实现http不同方法的请求
    C# 中List<T>与DataSet之间的转换
    C# 将文件夹中文件复制到另一个文件夹
    WinForm中 Asp.Net Signalr消息推送测试实例
    redis安装教程
  • 原文地址:https://www.cnblogs.com/sanwenyu/p/4572420.html
Copyright © 2011-2022 走看看