一、OAuth2解决什么问题
1、OAuth2提出的背景
照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源
2、图例
资源拥有者:照片拥有者
客户应用:云冲印
受保护的资源:照片
3、方式一:用户名密码复制
适用于同一公司内部的多个系统,不适用于不受信的第三方应用
4、方式二:通用开发者key
适用于合作商或者授信的不同业务部门之间
5、方式三:办法令牌
接近OAuth2方式,需要考虑如何管理令牌、颁发令牌、吊销令牌,需要统一的协议,因此就有了OAuth2协议
二、现代微服务安全
除了开放系统授权,OAuth2还可以应用于现代微服务安全
1、传统单块应用的安全
2、现代微服务安全
现代微服务中系统微服务化以及应用的形态和设备类型增多,不能用传统的登录方式
核心的技术不是用户名和密码,而是token
,由AuthServer颁发token,用户使用token进行登录
3、典型的OAuth2应用
4、OAuth2总结
三、什么是OAuth2
1、OAuth2正式定义
2、令牌的核心
3、OAuth2的历史
4、OAuth2的优势
5、OAuth2的不足
6、Auth2涉及的角色
7、OAuth2术语
8、OAuth2令牌的类型
9、OAuth2的误解
OAuth 2.0 的四种方式(推荐篇):
http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
四、微信扫描登录
1、准备工作
1、注册
2、邮箱激活
3、完善开发者资料
4、开发者资质认证
准备营业执照,1-2个工作日审批、300元
5、创建网站应用
提交审核,7个工作日审批
6、熟悉微信登录流程
获取access_token时序图
2、后端开发
1、添加配置
application.properties添加相关配置信息
注意:服务端口要改成8160,因为谷粒学院的业务服务器的端口改成了8160… 然后记得修改nginx配置.
# 服务端口 server.port=8160 # 微信开放平台 appid wx.open.app_id=wxed9954c01bb89b47 # 微信开放平台 appsecret wx.open.app_secret=a7482517235173ddb4083788de60b90e # 微信开放平台 重定向url wx.open.redirect_url=http://localhost:8160/api/ucenter/wx/callback
2、创建常量类
创建util包,创建ConstantWxUtils.java常量类
@Component //@PropertySource("classpath:application.properties") public class ConstantWxUtils implements InitializingBean { @Value("${wx.open.app_id}") private String appId; @Value("${wx.open.app_secret}") private String appSecret; @Value("${wx.open.redirect_url}") private String redirectUrl; public static String WX_OPEN_APP_ID; public static String WX_OPEN_APP_SECRET; public static String WX_OPEN_REDIRECT_URL; @Override public void afterPropertiesSet() throws Exception { WX_OPEN_APP_ID = appId; WX_OPEN_APP_SECRET = appSecret; WX_OPEN_REDIRECT_URL = redirectUrl; } }
3、创建controller
service_ucenter微服务中创建WxApiController类
/** * @author lxy * @version 1.0 * @Description * @date 2022/3/10 22:22 */ @CrossOrigin @Controller @RequestMapping("/api/ucenter/wx") public class WxApiController { @Autowired private UcenterMemberService memberService; //1.生成微信扫描二维码 @GetMapping("login") public String getWxCode(HttpSession session) { //固定地址,后面直接拼接参数 // String url = "https://open.weixin.qq.com/" + // "connect/qrconnect?appid="+ ConstantWxUtils.WX_OPEN_APP_ID+"&response_type=code"; //微信开放平台授权baseUrl %s相当于?代表占位符 String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" + "?appid=%s" + "&redirect_uri=%s" + "&response_type=code" + "&scope=snsapi_login" + "&state=%s" + "#wechat_redirect"; //对redirect_rul进行URLEncode编码 String redirectUrl = ConstantWxUtils.WX_OPEN_REDIRECT_URL; try { redirectUrl = URLEncoder.encode(redirectUrl, "utf-8"); } catch (Exception e) { e.printStackTrace(); } String url = String.format( baseUrl, ConstantWxUtils.WX_OPEN_APP_ID, redirectUrl, "atguigu" ); return "redirect:" + url; } }
授权url参数说明
参数 | 是否必须 | 说明 |
appid | 是 | 应用唯一标识 |
redirect_uri | 是 | 请使用urlEncode对链接进行处理 |
response_type | 是 | 填code |
scope | 是 | 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即 |
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 |