OAuth2.0对于用户相关的 OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。
流程:
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
以微博为例进行Oauth2进行第三方授权登录

1.进入微博开放平台→登陆微博→进入微连接→选择网站接入→选择立即接入→创建自己的应用→记住app key 和 app secret→进入高级信息,填写授权回调页的地址→进入文档,按照流程测试社交登陆

2.测试

使用以下url登录微博并得到code:

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redi
rect_uri=YOUR_REGISTERED_REDIRECT_URI

​​​​​​同意授权后,页面跳转至xxx/?code=CODE:

例:http://www.gulishop.com/success?code=fef987b3f9ad1169955840b467bfc661

使用code得到accessToken:

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE

然后就可以使用accessToken得到用户信息

注意:

1)、code 用后即毁
2)、access_token 在几天内是一样的
3)、uid 永久固定
3.Java代码编写
根据上面返回的json数据写一个VO
@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进行第三方授权登录相关推荐

  1. android 微博 4.1sdk,android使用新浪微博最新SDK4.1进行第三方授权登录

    android使用新浪微博最新SDK进行第三方授权登录 工具:android-studio 新浪SDK版本:4.1 1Demo参考 下载官方SDK:https://github.com/sinawei ...

  2. 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...

  3. Spring security 集成 JustAuth 实现第三方授权登录

    Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一.特性 spring security 集成 JustAuth 实现第三方授权登录 : 此项目从 用户管理脚手架( ...

  4. (二十二)admin-boot项目之集成just-auth实现第三方授权登录

    (二十二)集成just-auth实现第三方授权登录 项目地址:https://gitee.com/springzb/admin-boot 如果觉得不错,给个 star 简介: 这是一个基础的企业级基础 ...

  5. android 随手记 第三方授权登录,获取资料,分享

    帖子原文URL: http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文 ...

  6. aspnet登录界面代码_SPA+.NET Core3.1 GitHub第三方授权登录

    GitHub第三方授权登录 有许多文章都讲过GitHub第三方授权登录,但就是没有.NET Core配合前后端分离的项目(Vue,React)的实践.所以本文以前后端分离项目中如何在授权登录后,生成T ...

  7. uni-app 第三方授权登录

    uni-app 第三方授权登录 使用uniapp开发跨平台app, 难免会涉及第三方账号授权登录 uni-app官方文档 本文主要使用uni.login API实现第三方登录, H5上的授权登录, u ...

  8. OAUTH之 钉钉第三方授权登录

    文章目录 OAUTH之钉钉第三方授权登录 前期用到的工具 获取access_token 请求地址 请求方法 响应 扫码 / 使用账号密码 -- 获取 临时 code 参数重要说明 直接访问 扫码登录 ...

  9. 实现 Google 第三方授权登录

    最近做项目要实现Google的第三方登录,这简单的记录一下. 目前Google的第三方登录有很多方案,且官方提供SDK方便接入.但是我这个项目同时要实现网页和客户端.所以选择了 Google OAut ...

最新文章

  1. Turing渲染着色器网格技术分析
  2. 城市大脑全球标准研究3:如何理解城市大脑中的“大脑”?
  3. RMB符号的几种显示方式。
  4. WebSocket 实战
  5. 一文教你 Dubbo 服务性能压测(with JMeter)
  6. 【6月月报】新书加印与勘误,七大专栏齐上线,知识星球大改版!
  7. Vue与jQuery的区别:数据绑定
  8. php: 0跟字符串做比较永远是true。 php大bug。
  9. 持续交付 devops_DevOps如何帮助向用户交付出色的应用程序
  10. php 快速找到php.ini位置
  11. Codeforces - 346A - Alice and Bob - 简单数论
  12. Spring Cloud Hystrix Dashboard仪表盘 和 Turbine集群监控 (学习总结)
  13. java中编写一个学生抽奖活动_用java做的抽奖程序
  14. pygame模块实现乌龟吃鱼游戏案例
  15. jesd204b高速ad/da ad9172 AD9689调试记录
  16. 使用栈进行括号匹配的判断
  17. python:判断3个数不相等
  18. 设计模式初探之设计模式六大原则(3):依赖倒置原则
  19. linux外接HDMI显示器 不能正常显示的问题
  20. [hdu6148][Valley Numer]

热门文章

  1. 内部管理类软件基础架构思想(思路图解 + 配套免费视频)
  2. storm_spout详解
  3. c语言随机产生大小写字母,c# 产生随机字符串,包括大小写字母和数字
  4. Zotero 6 文献管理 + 内置PDF阅读器 + 选中翻译
  5. RegExp——正则表达式
  6. 先验后验与贝叶斯定理
  7. 耐心,细心,贴心,静心
  8. MIT线性代数笔记四 矩阵的LU分解
  9. C语言算法之将十进制数转换成二进制数
  10. goframe与gin对比(一) 综述