50-互联网安全架构-互联网API开放平台安全设计-基于OAuth2.0协议方式
程序员文章站
2023-12-27 14:04:51
...
1.什么是Oauth2.0认证过程
- 为什么会产生oauth2.0认证
互联网开放瓶体相互调用保证安全性(大型互联网公司) - 什么是开放平台:暴露公网提供API接口
微信联合登陆(读取微信头像),需要调用微信提供的第三方用户信息接口
2. 整个oauth2.0原理
oauth2.0原理(appid、appsecret、access_token、openid、回调地址、授权地址)
步骤:
1、在微信开放平台申请对应的appid信息
2、项目生成登陆授权链接
3、用户在确认微信登陆之后,跳转到回调地址(配置域名权限)
4、获取授权码code,使用授权码获取对应的access_token(调用腾讯接口权限)
5、使用access_token + openid获取用户相关信息
3. 第三方联合登陆过程
如何实现联合登陆, 底层是如何实现的?
在设计表user中
user_id, user_name, password, …, weixin_openid(数据库保存授权后openid)
那么程序中如何实现第二次不需要账号和密码登陆?
1、调用获取用户的openid
2、使用用户的openid去数据库表查询是否有对应的openid
3、如果有对应的openid,直接生成对应的令牌
4、没有对应的openid,那么久需要关联账号
@RequestMapping("/authorizedUrl")
public String authorizedUrl() {
String authorizedUrl = weiXinUtils.getAuthorizedUrl();
System.out.println("authorizedUrl : " + authorizedUrl);
//直接走重定向到微信开放平台
return "redirect:" + authorizedUrl;
}
@RequestMapping("/callback")
public String callback(String code) {
//1. 用户同意授权,获取code
if (StringUtils.isEmpty(code)) {
return "errorPage";
}
//2. 通过code获取网页授权access_token(调用微信接口权限)
String accessTokenUrl = weiXinUtils.getAccessTokenUrl(code);
JSONObject jsonObject = HttpClientUtils.httpGet(accessTokenUrl);
//3. 判断保温json中是够有errorCode
boolean containsErrorCode = jsonObject.containsKey("errorCode");
if (containsErrorCode) {
return "errorPage";
}
String accessToken = jsonObject.getString("access_token");
if (StringUtils.isEmpty(accessToken)) {
return "errorPage";
}
String openid = jsonObject.getString("openid");
if (StringUtils.isEmpty(openid)) {
return "errorPage";
}
//4. 拉去用户信息
String userInfo = weiXinUtils.getUserInfo(accessToken, openid);
JSONObject userInfoResult = HttpClientUtils.httpGet(userInfo);
//5.
System.out.println("userInfoResult: " + userInfoResult);
return "success";
}
实现微信授权获取信息
微信网页授权地址
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
1.填写网页授权回调地址权限
2.生成网页授权地址
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5c43fde3c9733d9e&redirect_uri=http://meitedu.s1.natapp.cc&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
3.跳转到回调地址获取授权码
http://meitedu.s1.natapp.cc/?code=061yIRgM13IOc41ZQveM1tODgM1yIRge&state=STATE
4. 通过code换取网页授权access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx5c43fde3c9733d9e&secret=b8b217126c33a5fb7074927d5e72a81a&code=061WfM4E0TABnc2Cv04E02Lb5E0WfM4b&grant_type=authorization_code
4. 拉取用户信息(需scope为 snsapi_userinfo)
https://api.weixin.qq.com/sns/userinfo?access_token=11_ZsmU50peG5LkOxn6XiFwXl9PRmlAlrFvWZ9fgxd3OM-vbiAHt_uf7gqG9iA9MnfIqf375eI8rkxf6GyqdsAkWw&openid=okYSmtzp4wWCrDCncMfGSRECVSeM&lang=zh_CN