以微博为例进行Oauth2进行第三方授权登录
1.进入微博开放平台→登陆微博→进入微连接→选择网站接入→选择立即接入→创建自己的应用→记住app key 和 app secret→进入高级信息,填写授权回调页的地址→进入文档,按照流程测试社交登陆
2.测试
使用以下url登录微博并得到code:
同意授权后,页面跳转至xxx/?code=CODE:
例:http://www.gulishop.com/success?code=fef987b3f9ad1169955840b467bfc661
使用code得到accessToken:
然后就可以使用accessToken得到用户信息
注意:
@Data
public class SocialUser {private String access_token;private String remind_in;private long expires_in;private String uid;private String isRealName;}
写Controller
@Autowiredprivate MemberFeignService memberFeignService;@GetMapping("/oauth2.0/weibo/success")public String weibo(@RequestParam("code") String code, HttpSession session){//1根据code换accessTokenMap<String,String> map = new HashMap<>();map.put("client_id","45346363");map.put("client_secret","gtr34t45yydf433y546r32");map.put("code",code);map.put("grant_type","authorization_code");map.put("redirect_uri","http://auth.gulimall.com/oauth2.0/weibo/success");try {HttpResponse post = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post",new HashMap<>(), map, new HashMap<>());//2处理if(post.getStatusLine().getStatusCode()==200){//获取accessTokenString json = EntityUtils.toString(post.getEntity());SocialUser socialUser = JSON.parseObject(json, SocialUser.class);//知道当前是哪个社交用户//1当前用户如果是第一次进网站,自动注册进来(为当前社交用户生成一个会员账号信息,以后这个社交账号就对应指定的会员)//登录或者注册这个社交用户R r = memberFeignService.oauth2Login(socialUser);if(r.getCode()==0){MemberResponseVo data = r.getData("data", new TypeReference<MemberResponseVo>() {});//1、第一次使用session,命令浏览器保存卡号,JSESSIONID这个cookie//以后浏览器访问哪个网站就会带上这个网站的cookie//TODO 1、默认发的令牌。当前域(解决子域session共享问题)//TODO 2、使用JSON的序列化方式来序列化对象到Redis中session.setAttribute(LOGIN_USER,data);//2、登录成功跳回首页return "redirect:http://gulimall.com";}else {return "redirect:http://auth.gulimall.com/login.html";}}else {return "redirect:http://auth.gulimall.com/login.html";}} catch (Exception e) {e.printStackTrace();}//2登陆成功跳转回首页return "redirect:http://gulimall.com";}
远程调用了oauth2Login方法进行真正的登录
@PostMapping("/oauth2/login")public R oauth2Login(@RequestBody SocialUser socialUser){MemberEntity entity = memberService.login(socialUser);if(entity!=null){return R.ok().setData(entity);}else {return R.error(BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getCode(), BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getMessage());}}
@Overridepublic MemberEntity login(SocialUser socialUser) {//登录和注册合并逻辑String uid = socialUser.getUid();//1判断当前社交用户是否已经登陆过系统MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("social_uid", uid));if(memberEntity!=null){//这个用户已经注册过了MemberEntity update = new MemberEntity();update.setId(memberEntity.getId());update.setAccessToken(socialUser.getAccess_token());update.setExpiresIn(socialUser.getExpires_in());this.baseMapper.updateById(update);memberEntity.setAccessToken(socialUser.getAccess_token());memberEntity.setExpiresIn(socialUser.getExpires_in());return memberEntity;}else {//2没查到就要注册MemberEntity regist = new MemberEntity();//3查询当前社交用户的社交账号信息try {Map<String,String> map = new HashMap<>();map.put("access_token",socialUser.getAccess_token());map.put("uid",socialUser.getUid());HttpResponse get = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<String, String>(), map);if(get.getStatusLine().getStatusCode()==200){String json = EntityUtils.toString(get.getEntity());JSONObject jsonObject = JSON.parseObject(json);String name = jsonObject.getString("name");String gender = jsonObject.getString("gender");regist.setNickname(name);regist.setGender("m".equals(gender)?1:2);}} catch (Exception e) {e.printStackTrace();}regist.setSocialUid(socialUser.getUid());regist.setExpiresIn(socialUser.getExpires_in());regist.setAccessToken(socialUser.getAccess_token());this.baseMapper.insert(regist);return regist;}}
其中,HttpUtils和MemberEntity分别是
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class HttpUtils {/*** get** @param host* @param path* @param method* @param headers* @param querys* @return* @throws Exception*/public static HttpResponse doGet(String host, String path, String method,Map<String, String> headers,Map<String, String> querys)throws Exception {HttpClient httpClient = wrapClient(host);HttpGet request = new HttpGet(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}return httpClient.execute(request);}/*** post form** @param host* @param path* @param method* @param headers* @param querys* @param bodys* @return* @throws Exception*/public static HttpResponse doPost(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,Map<String, String> bodys)throws Exception {HttpClient httpClient = wrapClient(host);HttpPost request = new HttpPost(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (bodys != null) {List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();for (String key : bodys.keySet()) {nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));}UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");request.setEntity(formEntity);}return httpClient.execute(request);}/*** Post String** @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPost(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,String body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPost request = new HttpPost(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (StringUtils.isNotBlank(body)) {request.setEntity(new StringEntity(body, "utf-8"));}return httpClient.execute(request);}/*** Post stream** @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPost(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,byte[] body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPost request = new HttpPost(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (body != null) {request.setEntity(new ByteArrayEntity(body));}return httpClient.execute(request);}/*** Put String* @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPut(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,String body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPut request = new HttpPut(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (StringUtils.isNotBlank(body)) {request.setEntity(new StringEntity(body, "utf-8"));}return httpClient.execute(request);}/*** Put stream* @param host* @param path* @param method* @param headers* @param querys* @param body* @return* @throws Exception*/public static HttpResponse doPut(String host, String path, String method,Map<String, String> headers,Map<String, String> querys,byte[] body)throws Exception {HttpClient httpClient = wrapClient(host);HttpPut request = new HttpPut(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}if (body != null) {request.setEntity(new ByteArrayEntity(body));}return httpClient.execute(request);}/*** Delete** @param host* @param path* @param method* @param headers* @param querys* @return* @throws Exception*/public static HttpResponse doDelete(String host, String path, String method,Map<String, String> headers,Map<String, String> querys)throws Exception {HttpClient httpClient = wrapClient(host);HttpDelete request = new HttpDelete(buildUrl(host, path, querys));for (Map.Entry<String, String> e : headers.entrySet()) {request.addHeader(e.getKey(), e.getValue());}return httpClient.execute(request);}private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {StringBuilder sbUrl = new StringBuilder();sbUrl.append(host);if (!StringUtils.isBlank(path)) {sbUrl.append(path);}if (null != querys) {StringBuilder sbQuery = new StringBuilder();for (Map.Entry<String, String> query : querys.entrySet()) {if (0 < sbQuery.length()) {sbQuery.append("&");}if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {sbQuery.append(query.getValue());}if (!StringUtils.isBlank(query.getKey())) {sbQuery.append(query.getKey());if (!StringUtils.isBlank(query.getValue())) {sbQuery.append("=");sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));}}}if (0 < sbQuery.length()) {sbUrl.append("?").append(sbQuery);}}return sbUrl.toString();}private static HttpClient wrapClient(String host) {HttpClient httpClient = new DefaultHttpClient();if (host.startsWith("https://")) {sslClient(httpClient);}return httpClient;}private static void sslClient(HttpClient httpClient) {try {SSLContext ctx = SSLContext.getInstance("TLS");X509TrustManager tm = new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] xcs, String str) {}public void checkServerTrusted(X509Certificate[] xcs, String str) {}};ctx.init(null, new TrustManager[] { tm }, null);SSLSocketFactory ssf = new SSLSocketFactory(ctx);ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);ClientConnectionManager ccm = httpClient.getConnectionManager();SchemeRegistry registry = ccm.getSchemeRegistry();registry.register(new Scheme("https", 443, ssf));} catch (KeyManagementException ex) {throw new RuntimeException(ex);} catch (NoSuchAlgorithmException ex) {throw new RuntimeException(ex);}}
}
@Data
@TableName("ums_member")
public class MemberEntity implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableIdprivate Long id;/*** 会员等级id*/private Long levelId;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 昵称*/private String nickname;/*** 手机号码*/private String mobile;/*** 邮箱*/private String email;/*** 头像*/private String header;/*** 性别*/private Integer gender;/*** 生日*/private Date birth;/*** 所在城市*/private String city;/*** 职业*/private String job;/*** 个性签名*/private String sign;/*** 用户来源*/private Integer sourceType;/*** 积分*/private Integer integration;/*** 成长值*/private Integer growth;/*** 启用状态*/private Integer status;/*** 注册时间*/private Date createTime;private String socialUid;private String accessToken;private Long expiresIn;}
以微博为例进行Oauth2进行第三方授权登录相关推荐
- android 微博 4.1sdk,android使用新浪微博最新SDK4.1进行第三方授权登录
android使用新浪微博最新SDK进行第三方授权登录 工具:android-studio 新浪SDK版本:4.1 1Demo参考 下载官方SDK:https://github.com/sinawei ...
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...
- Spring security 集成 JustAuth 实现第三方授权登录
Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一.特性 spring security 集成 JustAuth 实现第三方授权登录 : 此项目从 用户管理脚手架( ...
- (二十二)admin-boot项目之集成just-auth实现第三方授权登录
(二十二)集成just-auth实现第三方授权登录 项目地址:https://gitee.com/springzb/admin-boot 如果觉得不错,给个 star 简介: 这是一个基础的企业级基础 ...
- android 随手记 第三方授权登录,获取资料,分享
帖子原文URL: http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文 ...
- aspnet登录界面代码_SPA+.NET Core3.1 GitHub第三方授权登录
GitHub第三方授权登录 有许多文章都讲过GitHub第三方授权登录,但就是没有.NET Core配合前后端分离的项目(Vue,React)的实践.所以本文以前后端分离项目中如何在授权登录后,生成T ...
- uni-app 第三方授权登录
uni-app 第三方授权登录 使用uniapp开发跨平台app, 难免会涉及第三方账号授权登录 uni-app官方文档 本文主要使用uni.login API实现第三方登录, H5上的授权登录, u ...
- OAUTH之 钉钉第三方授权登录
文章目录 OAUTH之钉钉第三方授权登录 前期用到的工具 获取access_token 请求地址 请求方法 响应 扫码 / 使用账号密码 -- 获取 临时 code 参数重要说明 直接访问 扫码登录 ...
- 实现 Google 第三方授权登录
最近做项目要实现Google的第三方登录,这简单的记录一下. 目前Google的第三方登录有很多方案,且官方提供SDK方便接入.但是我这个项目同时要实现网页和客户端.所以选择了 Google OAut ...
最新文章
- Turing渲染着色器网格技术分析
- 城市大脑全球标准研究3:如何理解城市大脑中的“大脑”?
- RMB符号的几种显示方式。
- WebSocket 实战
- 一文教你 Dubbo 服务性能压测(with JMeter)
- 【6月月报】新书加印与勘误,七大专栏齐上线,知识星球大改版!
- Vue与jQuery的区别:数据绑定
- php: 0跟字符串做比较永远是true。 php大bug。
- 持续交付 devops_DevOps如何帮助向用户交付出色的应用程序
- php 快速找到php.ini位置
- Codeforces - 346A - Alice and Bob - 简单数论
- Spring Cloud Hystrix Dashboard仪表盘 和 Turbine集群监控 (学习总结)
- java中编写一个学生抽奖活动_用java做的抽奖程序
- pygame模块实现乌龟吃鱼游戏案例
- jesd204b高速ad/da ad9172 AD9689调试记录
- 使用栈进行括号匹配的判断
- python:判断3个数不相等
- 设计模式初探之设计模式六大原则(3):依赖倒置原则
- linux外接HDMI显示器 不能正常显示的问题
- [hdu6148][Valley Numer]