【笔记于学习尚硅谷课程所作】
1、OAuth2.0简介
OAuth (开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
2、去微博申请认证权限
1.去微博的开放平台,登录并进入微连接–>网站接入–>立即接入
2.创建新应用(没完善信息的先完善信息)
3.完善回调页信息
4.接下来使用的步骤
- 引导需要授权的用户到如下地址
- 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE
- 换取Access Token
5.查看应用信息
3、使用社交登录
1.引导需要授权的用户到如下地址
https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
//YOUR_CLIENT_ID -->App Key
//YOUR_REGISTERED_REDIRECT_URI-->回调页成功的地址
2.在跳转地址中,放入授权地址
<a href="https://api.weibo.com/oauth2/authorize?client_id=3317019994&response_type=code&redirect_uri=http://gulimall.com/oauth2.0/weibo/success">
<img style="width: 50px; height: 18px" src="/static/login/JD_img/weibo.png" />
</a>
3.编写controller,获取Access Token
@Slf4j
@Controller
public class OAuth2Controller {
@Autowired
private MemberFeignService memberFeignService;
/**
* 根据code换取accessToken - 调用远程gulimall-member服务进行社交登录或注册
* @param code
* @return
* @throws Exception
*/
@GetMapping("/oauth2.0/weibo/success")
public String weibo(@RequestParam("code") String code, HttpSession session, HttpServletResponse servletResponse) throws Exception {
// 根据code换取accessToken
Map<String, String> map = new HashMap<>();
map.put("client_id", "3317019994");//App Key
map.put("client_secret", "f39dddba437c5801944bfd7eb74815f1");//App Secret
map.put("grant_type", "authorization_code");
map.put("redirect_uri", "http://auth.gulimall.com/oauth2.0/weibo/success");//授权页回调地址
map.put("code", code);
HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<String, String>(), null, map);
// 2、处理响应数据
if (response.getStatusLine().getStatusCode() == 200) {
// 获取到了accessToken
String json = EntityUtils.toString(response.getEntity()); // 将响应的内容转换成json字符串
SocialUserVo socialUserVo = JSON.parseObject(json, SocialUserVo.class); // 将获取到的json转换成SocialUserVo对象
// 1、会员第一次登陆,自动注册(为当前社交用户生成一个会员信息账号,以后这个社交账号就对应指定的会员信息)
// 调用远程服务 gulimall-member 登陆或注册操作
R r = memberFeignService.oauthLogin(socialUserVo);
if (r.getCode() == 0) {
MemberRespVo memberRespVo = r.getData("data", new TypeReference<MemberRespVo>() {
});
log.info("微博用户登录成功,用户信息:{}", memberRespVo);
session.setAttribute(AuthServerConstant.LOGIN_USER, memberRespVo);
return "redirect:http://gulimall.com";
} else {
return "redirect:http://auth.gulimall.com/login.html";
}
} else { // 远程请求社交服务获取数据失败
return "redirect:http://auth.gulimall.com/login.html";
}
}
}