V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hanbings
V2EX  ›  OAuth

Java 小小写个开源 OAuth 客户端工具

  •  
  •   hanbings · 2023-01-06 20:56:39 +08:00 · 1356 次点击
    这是一个创建于 716 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前正在适配常见的国外平台,迟一些会做国内的像 QQ 微信 WB 百度 阿里 什么的

    欢迎 Star 跟进! Github:Fluocean

    Fluocean

    主要特性:

    • 常见的 OAuth 平台适配
    • 支持自定义 State 生成器、自定义 Http 客户端、自定义 Json 解析器
    • 提供通用默认实现以便支持未适配 OAuth 平台
    • 默认 Http 客户端实现支持 Socks 代理
    • 可爱

    Github OAuth 示例

    洋流提供了许多的重载方法,用于应对不同情况下的请求,有些带自有请求头的,也有要求必须要 Scope 的。

    // 创建 OAuth 原始处理器
    OAuth<GithubAccess, GithubAccess.Wrong> oauth = new GithubOAuth(
    	"id",
    	"secret",
    	"https://exmaple.com/api/v0/login/oauth/github/callback"
    );
    
    // 生成授权 url
    String url = oauth.authorize();
    // 生成带参数或指定 scope
    String spec = oauth.authorize(List.of("email"), Map.of("Accept", "application/json"));
            
    //解析回调的 url 并获取 token
    // 输入原始 url 自动解析 code 以及 state
    oauth.token("url");
    // 更改回调地址
    oauth.token("url", "redirect");
    // 手动指定参数
    oauth.token("code", "state", "redirect");
            
    // 处理返回值
    oauth.token("code", "state", "redirect")
    	.succeed(data -> System.out.println(data.accessToken()))
    	.fail(wrong -> System.out.println(wrong.errorDescription()))
    	.except(throwable -> System.out.println(throwable.getMessage()));
            
    // 假设请求成功 直接获取数据
    GithubAccess access = oauth.token("code", "state", "redirect").data();
    

    使用 Socks 代理

    oauth.proxy(() ->
    	new Request.Proxy(
    		Proxy.Type.SOCKS,
    		"127.0.0.1",
    		10086,
    		"username",
    		"password"
    	)
    );
    

    更换 State 生成器

    默认随机生成 UUID 并设置 300 秒有效期

    oauth.state(
        Lazy.of(() -> new OAuthState(300, () -> UUID.randomUUID().toString()))
    );
    

    更换 Http 客户端

    默认使用 Okhttp 发起请求

    // 实现比较繁杂 就不展示啦 x
    oauth.request(Lazy.of(OAuthRequest::new));
    

    更换 Json 解析器

    默认使用 Gson 作为 Json 解析器

    oauth.serialization(
    	Lazy.of(() -> new Serialization() {
    		final Gson gson = new Gson();
    
    		@Override
    		public <T> T object(Class<T> type, String raw) {
    			return gson.fromJson(raw, type);
    		}
    
    		@Override
    		public <K, V> Map<K, V> map(Class<K> key, Class<V> value, String raw) {
    			return gson.fromJson(raw, new TypeToken<Map<K, V>>() {
    			}.getType());
    		}
    
    		@Override
    		public <T> List<T> list(Class<T> type, String raw) {
    			return gson.fromJson(raw, new TypeToken<List<T>>() {
    			}.getType());
    		}
    	})
    );
    
    4 条回复    2023-01-07 15:24:54 +08:00
    EvanLuo42
        1
    EvanLuo42  
       2023-01-06 21:32:37 +08:00 via iPhone
    可以,但是好像有 justauth 了?
    hanbings
        2
    hanbings  
    OP
       2023-01-06 21:49:01 +08:00
    @EvanLuo42 你好,我了解过 JustAuth​,以前也是 JustAuth 的用户,不可否认的是它能做到万星项目和 GVIP 说明它很受欢迎、很流行。但是 JustAuth 目前更新缓慢,不支持很多国外的平台需要自己手动适配,不支持更换 Json 解析器(这个问题已经很久了,相关 issue 都半年以上了,默认的解析器是名声不太好的 fastjson 大家都懂)。没有详细的贡献指南让我实在有点无从下手去贡献代码,权衡之下,我还是决定多造一次轮子了,感谢你的支持!
    brrruski
        3
    brrruski  
       2023-01-06 22:44:11 +08:00 via iPad
    关注一波 有这方面需求
    hanbings
        4
    hanbings  
    OP
       2023-01-07 15:24:54 +08:00
    @brrruski 因为是个人项目,如果有什么具体需求,比如某个特性支持或者某个比较小众的平台也可以提出来适配的,感谢支持啦!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2241 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:05 · PVG 00:05 · LAX 08:05 · JFK 11:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.