JuthAuth实现第三方扫码登录之微信登录

第一步:申请微信开放平台账号(已经申请的可以跳过这一步)
https://open.weixin.qq.com/

第二步:申请开发者资质认证
重点:微信开放平台申请应用是需要认证开发者资质。(300元)
申请资质的时候要注意:微信授权公函需要用一笔一划的正楷字去写(其实也就是一个企业的主体,主体就是对应开放平台账号的企业主体信息),不然的话,会出现审核无法通过的情况,并且只有4次机会可以申请。
个人无法做测试,如果需要使用,要么自己有公司或者使用其他公司的信息作资质认证。

第三步:创建第三方网站应用
注意:其实开放平台可以绑定很多应用,比如移动APP、网站、公众号、或者其他第三方平台,但是这里只讲网站应用实现微信开放平台的授权登录。
认证通过后切换到“网站应用”标签页,点击“创建网站应用”按钮

创建完成后需要等待审核,大概1-3个工作日内就会通过审核,审核通过后,就能看到网站对应的信息。

点击“查看”即可看到oauth:AppId、AppSecret、授权回调域,分别对应了JustAuth的 Client ID、Client Secret、 Callback URL

注意:
”授权回调域“填写对应域名即可,比如我要给http://www.xxxx.cn/增加扫码登录功能,那么我只要在”授权回调域“中填写www.xxxx.cn即可,那么我在程序中配置的回调地址为:https://www.xxxx.cn/oauth/callback/wechat
一定要确保应用详情页中的”接口信息“中的”微信登录“接口的状态为”以获得“。
”应用密钥“要确保不要泄露。
第四步:集成JustAuth,引入Jar包或者依赖
1、当项目为Maven项目,在pom.xml中引入以下依赖

<dependency>
  <groupId>me.zhyd.oauth</groupId>
  <artifactId>JustAuth</artifactId>
  <version>${latest.version}</version>
</dependency>

2、项目为一般的WEB项目
在Maven仓库中下载JustAuth的jar包
原Maven仓库:https://mvnrepository.com/
Maven阿里巴巴的国内镜像仓库https://maven.aliyun.com/

第五步:引入其他依赖包(可在Maven获取)
simple-http
httpclient
httpcore

第六步:正式开始开发
1、创建request

AuthRequest authRequest = new AuthWeChatRequest(AuthConfig.builder() .clientId("Client ID") .clientSecret("Client Secret") .redirectUri("https://www.xxxx.cn/oauth/callback/wechat") .build());

2、生成授权地址
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
拿到地址链接我们可以在后端重定向,也可以先返回前端,前端控制跳转,前端控制的好处是可以将第三方授权页嵌套到登录页面上,适配网站的设计。

3、完整 Controller代码

import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.request.AuthWeChatOpenRequest;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;import java.io.IOException;

@RestController
@RequestMapping("/oauth")
public class RestAuthController {

    @RequestMapping("/render")
    public void renderAuth(String source, HttpServletResponse response) throws IOException {
        AuthRequest authRequest = getAuthRequest();
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }
    @RequestMapping("/callback")
    public Object login(String source, AuthCallback callback) {
        AuthUser authUser = null;
        AuthRequest authRequest = getAuthRequest();
        AuthResponse response = authRequest.login(callback);
        if(response.getData() instanceof AuthUser) {
            authUser =  (AuthUser)response.getData();
            //插入数据
        }
        return authUser;
    }
    private AuthRequest getAuthRequest(String source) {
        String clientId = Global.getProperty("oauth2." + source + ".clientId");
        if (StringUtils.isBlank(clientId)) {
            throw new AuthException("非法操作,未知未授权类型:" + source);
        }
        AuthConfig.AuthConfigBuilder config = AuthConfig.builder().clientId(clientId);
        config.clientSecret(Global.getProperty("oauth2." + source + ".clientSecret"));
        config.redirectUri(Global.getProperty("oauth2." + source + ".redirectUri"));
        AuthRequest authRequest = null;
        switch (source)
        {
            case "gitee":
              authRequest = new AuthGiteeRequest(config.build());
              break;
            case "qq":
              authRequest = new AuthQqRequest(config.build());
              break;
            case "weixin":
              authRequest = new AuthWeChatOpenRequest(config.build());
              break;
            case "weixin_mp":
              authRequest = new AuthWeChatMpRequest(config.build());
              break;
            case "weixin_qy":
              authRequest = new AuthWeChatEnterpriseRequest(config.build());
              break;
            case "ding_talk":
              authRequest = new AuthDingTalkRequest(config.build());
        }
        return authRequest;
    }
}

4、创建第三授权登录表

CREATE TABLE `oauth2_user` (
  `id` varchar(64) NOT NULL COMMENT '编号',
  `user_source` varchar(100) DEFAULT NULL COMMENT '用户来源',
  `user_uuid` varchar(128) DEFAULT NULL COMMENT '第三方用户ID',
  `username` varchar(200) DEFAULT NULL COMMENT '用户名',
  `nickname` varchar(200) DEFAULT NULL COMMENT '用户昵称',
  `avatar` varchar(500) DEFAULT NULL COMMENT '用户头像',
  `blog` varchar(500) DEFAULT NULL COMMENT '用户网址',
  `company` varchar(200) DEFAULT NULL COMMENT '所在公司',
  `location` varchar(200) DEFAULT NULL COMMENT '所在位置',
  `email` varchar(500) DEFAULT NULL COMMENT '用户邮箱',
  `remark` varchar(500) DEFAULT NULL COMMENT '用户备注',
  `gender` varchar(10) DEFAULT NULL COMMENT '用户性别',
  `create_date` datetime DEFAULT NULL COMMENT '创建时间',
  `update_date` datetime DEFAULT NULL COMMENT '更新时间',
  `user_code` varchar(64) DEFAULT NULL COMMENT '绑定用户编码',
  PRIMARY KEY (`id`),
  KEY `idx_sys_oauth2_user_uuid` (`user_uuid`),
  KEY `idx_sys_oauth2_user_sou` (`user_source`),
  KEY `idx_sys_oauth2_user_uc` (`user_code`),
  KEY `idx_sys_oauth2_user_cd` (`create_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第三方授权登录';

最后重要的事情说三遍:开发的时候要看文档!!!开发的时候要看文档!!!开发的时候要看文档!!!

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页