JustAuth整合第三方登录组件样例
一、官网
整合平台:
- QQ登录
- 新浪微博登录
- 百度登录
- Gitee登录
- Github登录
- 开源中国登录
- StackOverflow登录
- Coding(腾讯云)登录
- 程序员客栈登录
- CSDN登录
- Google登录
- Facebook登录
- 钉钉登录
- 阿里云登录
- 支付宝登录
- 华为登录
- 飞书登录
- 微信开放平台登录
- 企业微信扫码登录
- 企业微信网页登录
- 抖音登录
- 京东登录
二、样例-微信开放平台登录
2.1 引入依赖
<dependency> <groupId>me.zhyd.oauth</groupId> <artifactId>JustAuth</artifactId> <version>${latest.version}</version> </dependency>
2.2 创建Request
AuthRequest authRequest = new AuthWeChatRequest(AuthConfig.builder() .clientId("Client ID") .clientSecret("Client Secret") .redirectUri("https://www.zhyd.me/oauth/callback/wechat") .build());
2.3 生成授权地址
我们可以直接使用以下方式生成第三方平台的授权链接
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
这个链接我们可以直接后台重定向跳转,也可以返回到前端后,前端控制跳转。前端控制的好处就是,可以将第三方的授权页嵌入到iframe中,适配网站设计。
完整代码如下
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(HttpServletResponse response) throws IOException { AuthRequest authRequest = getAuthRequest(); response.sendRedirect(authRequest.authorize(AuthStateUtils.createState())); } @RequestMapping("/callback") public Object login(AuthCallback callback) { AuthRequest authRequest = getAuthRequest(); return authRequest.login(callback); } private AuthRequest getAuthRequest() { return new AuthWeChatOpenRequest(AuthConfig.builder() .clientId("Client ID") .clientSecret("Client Secret") .redirectUri("https://www.zhyd.me/oauth/callback/wechat") .build()); } }
三、集群环境问题
3.1 JustAuth默认使用Map做为缓存
JustAuth默认使用ConcurrentHashMap做为缓存,在单机环境下无问题,但在集群环境下(分布式多实例部署的应用)就会出现问题。
JustAuth部分源码
public class AuthWeChatOpenRequest extends AuthDefaultRequest { public AuthWeChatOpenRequest(AuthConfig config) { super(config, AuthDefaultSource.WECHAT_OPEN); } public AuthWeChatOpenRequest(AuthConfig config, AuthStateCache authStateCache) { super(config, AuthDefaultSource.WECHAT_OPEN, authStateCache); } ..... } public class AuthDefaultCache implements AuthCache { /** * state cache */ private static Map<String, CacheState> stateCache = new ConcurrentHashMap<>(); private final ReentrantReadWriteLock cacheLock = new ReentrantReadWriteLock(true); private final Lock writeLock = cacheLock.writeLock(); private final Lock readLock = cacheLock.readLock(); public AuthDefaultCache() { if (AuthCacheConfig.schedulePrune) { this.schedulePrune(AuthCacheConfig.timeout); } } }
3.2 自定义使用Reids做缓存解决集群问题
3.2.1 实现AuthStateCache接口
import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.cache.AuthCacheConfig; import me.zhyd.oauth.cache.AuthStateCache; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.concurrent.TimeUnit; /** * 自定义AuthState Rds 缓存 * @author zak **/ @Slf4j @Component public class AuthStateRedisCache implements AuthStateCache { @Autowired private StringRedisTemplate stringRedisTemplate; /** * 存入缓存,默认3分钟 * * @param key 缓存key * @param value 缓存内容 */ @Override public void cache(String key, String value) { log.info("RDS, 存入缓存,默认3分钟, key: {}, value: {}", key, value); stringRedisTemplate.opsForValue().set(key, value, AuthCacheConfig.timeout, TimeUnit.MILLISECONDS); } /** * 存入缓存 * * @param key 缓存key * @param value 缓存内容 * @param timeout 指定缓存过期时间(毫秒) */ @Override public void cache(String key, String value, long timeout) { log.info("RDS, 存入缓存, key: {}, value: {}, timeout: {}", key, value, timeout); stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.MILLISECONDS); } /** * 获取缓存内容 * * @param key 缓存key * @return 缓存内容 */ @Override public String get(String key) { return stringRedisTemplate.opsForValue().get(key); } /** * 是否存在key,如果对应key的value值已过期,也返回false * * @param key 缓存key * @return true:存在key,并且value没过期;false:key不存在或者已过期 */ @Override public boolean containsKey(String key) { return stringRedisTemplate.hasKey(key); } }
3.2.2 使用自定义缓存
@Resource private AuthStateRedisCache stateRedisCache; AuthRequest authRequest = new AuthWeChatOpenRequest(AuthConfig.builder() .clientId(wechatAppId) .clientSecret(wechatAppSecret) .redirectUri(StrUtil.isNotBlank(redirectUri) ? redirectUri : wechatRedirectUri) .build(), stateRedisCache);
以上就是JustAuth整合第三方登录组件样例的详细内容,更多关于JustAuth整合第三方登录组件的资料请关注脚本之家其它相关文章!
相关文章
java基础之Collection与Collections和Array与Arrays的区别
这篇文章主要介绍了java基础之Collection与Collections和Array与Arrays的区别的相关资料,本文主要说明两者的区别以防大家混淆概念,需要的朋友可以参考下2017-08-08SpringBoot中Shiro缓存使用Redis、Ehcache的方法
这篇文章主要介绍了SpringBoot中Shiro缓存使用Redis、Ehcache的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-09-09IntellJ idea使用FileWatch实时编译less文件的方法
这篇文章主要介绍了IntellJ idea使用FileWatch实时编译less文件的相关资料,需要的朋友可以参考下2018-02-02Spring Cloud出现Options Forbidden 403问题解决方法
本篇文章主要介绍了Spring Cloud出现Options Forbidden 403问题解决方法,具有一定的参考价值,有兴趣的可以了解一下2017-11-11AsyncHttpClient exception异常源码流程解析
这篇文章主要为大家介绍了AsyncHttpClient的exception源码流程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12java CompletableFuture异步任务编排示例详解
这篇文章主要为大家介绍了java CompletableFuture异步任务编排示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11
最新评论