mirror of
https://gitee.com/yadong.zhang/JustAuth.git
synced 2025-12-07 01:08:24 +08:00
✨ 支持抖音和领英,其他更新内容参考update.md
This commit is contained in:
parent
c951ffad59
commit
3f67757a3a
38
README.md
38
README.md
@ -19,20 +19,22 @@
|
|||||||
<center>
|
<center>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" width="200"><a href="#授权gitee"><img src="https://gitee.com/logo_icon.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权gitee"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/gitee.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权github"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/github.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权github"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/github.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权weibo"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/weibo.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权weibo"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/weibo.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权钉钉"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/dingding.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权钉钉"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/dingTalk.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权百度"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权百度"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权coding"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权coding"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权腾讯云开发者平台"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencent_cloud.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权腾讯云开发者平台"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencentCloud.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权oschina"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschinas.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权oschina"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschina.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权支付宝"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/alipay.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权支付宝"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/alipay.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权qq"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权qq"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权微信"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechats.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权微信"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权淘宝"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权淘宝"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权google"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权google"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权facebook"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权facebook"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png" width="20"></a></td>
|
||||||
|
<td align="center" width="200"><a href="#授权抖音"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/douyin.png" width="20"></a></td>
|
||||||
|
<td align="center" width="200"><a href="#授权领英"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/linkedin.png" width="20"></a></td>
|
||||||
<td align="center" width="200"><a href="#授权csdn"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png" width="20"></a></td>
|
<td align="center" width="200"><a href="#授权csdn"><img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png" width="20"></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@ -46,7 +48,15 @@ JustAuth,如你所见,它仅仅是一个**第三方授权登录**的**工具
|
|||||||
|
|
||||||
项目开源地址:[gitee](https://gitee.com/yadong.zhang/JustAuth) | [github](https://github.com/zhangyd-c/JustAuth)
|
项目开源地址:[gitee](https://gitee.com/yadong.zhang/JustAuth) | [github](https://github.com/zhangyd-c/JustAuth)
|
||||||
|
|
||||||
|
## 特点
|
||||||
|
|
||||||
|
废话不多说,就俩字:
|
||||||
|
|
||||||
|
1. **全**:已集成十多家第三方平台(国内外常用的基本都已包含),后续依然还有扩展计划!
|
||||||
|
2. **简**:API就是奔着最简单去设计的(见后面`快速开始`),尽量让您用起来没有障碍感!
|
||||||
|
|
||||||
## 快速开始
|
## 快速开始
|
||||||
|
|
||||||
- 引入依赖
|
- 引入依赖
|
||||||
```xml
|
```xml
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -79,20 +89,22 @@ authRequest.login("code");
|
|||||||
#### API列表
|
#### API列表
|
||||||
| :computer: 平台 | :coffee: API类 | :page_facing_up: SDK |
|
| :computer: 平台 | :coffee: API类 | :page_facing_up: SDK |
|
||||||
|:------:|:-------:|:-------:|
|
|:------:|:-------:|:-------:|
|
||||||
| <img src="https://gitee.com/logo_icon.png" width="20"> | [AuthGiteeRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | <a href="https://gitee.com/api/v5/oauth_doc#list_1" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/gitee.png" width="20"> | [AuthGiteeRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | <a href="https://gitee.com/api/v5/oauth_doc#list_1" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/github.png" width="20"> | [AuthGithubRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | <a href="https://github.com/settings/developers" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/github.png" width="20"> | [AuthGithubRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | <a href="https://github.com/settings/developers" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/weibo.png" width="20"> | [AuthWeiboRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | <a href="https://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/weibo.png" width="20"> | [AuthWeiboRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | <a href="https://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/dingding.png" width="20"> | [AuthDingTalkRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java) | <a href="https://open-doc.dingtalk.com/microapp/serverapi2/kymkv6" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/dingTalk.png" width="20"> | [AuthDingTalkRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java) | <a href="https://open-doc.dingtalk.com/microapp/serverapi2/kymkv6" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png" width="20"> | [AuthBaiduRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java) | <a href="https://developer.baidu.com/" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png" width="20"> | [AuthBaiduRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java) | <a href="https://developer.baidu.com/" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png" width="25"> | [AuthCodingRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java) | <a href="https://open.coding.net/references/oauth/" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png" width="25"> | [AuthCodingRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java) | <a href="https://open.coding.net/references/oauth/" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencent_cloud.png" width="25"> | [AuthTencentCloudRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java) | <a href="https://dev.tencent.com/help/doc/faq/b4e5b7aee786/oauth" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencentCloud.png" width="25"> | [AuthTencentCloudRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java) | <a href="https://dev.tencent.com/help/doc/faq/b4e5b7aee786/oauth" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschinas.png" width="20"> | [AuthOschinaRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java) | <a href="https://www.oschina.net/openapi/docs/openapi_user" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschina.png" width="20"> | [AuthOschinaRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java) | <a href="https://www.oschina.net/openapi/docs/openapi_user" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/alipay.png" width="20"> | [AuthAlipayRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java) | <a href="https://alipay.open.taobao.com/docs/doc.htm?spm=a219a.7629140.0.0.336d4b70GUKXOl&treeId=193&articleId=105809&docType=1" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/alipay.png" width="20"> | [AuthAlipayRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java) | <a href="https://alipay.open.taobao.com/docs/doc.htm?spm=a219a.7629140.0.0.336d4b70GUKXOl&treeId=193&articleId=105809&docType=1" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png" width="20"> | [AuthQqRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java) | <a href="http://wiki.connect.qq.com/" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png" width="20"> | [AuthQqRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java) | <a href="http://wiki.connect.qq.com/" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechats.png" width="20"> | [AuthWeChatRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java) | <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png" width="20"> | [AuthWeChatRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java) | <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png" width="20"> | [AuthTaobaoRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java) | <a href="https://open.taobao.com/doc.htm?spm=a219a.7386797.0.0.4e00669acnkQy6&source=search&docId=105590&docType=1" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png" width="20"> | [AuthTaobaoRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java) | <a href="https://open.taobao.com/doc.htm?spm=a219a.7386797.0.0.4e00669acnkQy6&source=search&docId=105590&docType=1" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png" width="20"> | [AuthGoogleRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java) | <a href="https://developers.google.com/identity/protocols/OpenIDConnect" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png" width="20"> | [AuthGoogleRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java) | <a href="https://developers.google.com/identity/protocols/OpenIDConnect" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png" width="20"> | [AuthFacebookRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java) | <a href="https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow" target="_blank">参考文档</a> |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png" width="20"> | [AuthFacebookRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java) | <a href="https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow" target="_blank">参考文档</a> |
|
||||||
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/douyin.png" width="20"> | [AuthDouyinRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java) | <a href="https://www.douyin.com/platform/doc" target="_blank">参考文档</a> |
|
||||||
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/linkedin.png" width="20"> | [AuthLinkedinRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java) | <a href="https://docs.microsoft.com/zh-cn/linkedin/shared/authentication/authorization-code-flow?context=linkedin/context" target="_blank">参考文档</a> |
|
||||||
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png" width="20"> | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 |
|
| <img src="https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png" width="20"> | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 |
|
||||||
|
|
||||||
_请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_
|
_请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_
|
||||||
@ -178,6 +190,12 @@ _请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
#### 授权抖音
|
||||||
|
|
||||||
|
|
||||||
|
#### 授权领英
|
||||||
|
|
||||||
|
|
||||||
#### 授权csdn
|
#### 授权csdn
|
||||||
|
|
||||||
_请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_
|
_请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>me.zhyd.oauth</groupId>
|
<groupId>me.zhyd.oauth</groupId>
|
||||||
<artifactId>JustAuth</artifactId>
|
<artifactId>JustAuth</artifactId>
|
||||||
<version>1.3.3</version>
|
<version>1.4.0</version>
|
||||||
|
|
||||||
<name>JustAuth</name>
|
<name>JustAuth</name>
|
||||||
<url>https://gitee.com/yadong.zhang/JustAuth</url>
|
<url>https://gitee.com/yadong.zhang/JustAuth</url>
|
||||||
|
|||||||
@ -67,6 +67,8 @@ public class AuthorizationFactory {
|
|||||||
AuthorizationFactory.register(AuthSource.WECHAT, new WeChatAuthorization());
|
AuthorizationFactory.register(AuthSource.WECHAT, new WeChatAuthorization());
|
||||||
AuthorizationFactory.register(AuthSource.WEIBO, new WeiboAuthorization());
|
AuthorizationFactory.register(AuthSource.WEIBO, new WeiboAuthorization());
|
||||||
AuthorizationFactory.register(AuthSource.FACEBOOK, new FacebookAuthorization());
|
AuthorizationFactory.register(AuthSource.FACEBOOK, new FacebookAuthorization());
|
||||||
|
AuthorizationFactory.register(AuthSource.DOUYIN, new DouyinAuthorization());
|
||||||
|
AuthorizationFactory.register(AuthSource.LINKEDIN, new LinkedinAuthorization());
|
||||||
loader = true;
|
loader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,19 @@
|
|||||||
|
package me.zhyd.oauth.authorization;
|
||||||
|
|
||||||
|
import me.zhyd.oauth.config.AuthConfig;
|
||||||
|
import me.zhyd.oauth.utils.UrlBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抖音授权
|
||||||
|
*
|
||||||
|
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
||||||
|
* @version 1.0
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
public class DouyinAuthorization implements Authorization {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizeUrl(AuthConfig config) {
|
||||||
|
return UrlBuilder.getDouyinAuthorizeUrl(config.getClientId(), config.getRedirectUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package me.zhyd.oauth.authorization;
|
||||||
|
|
||||||
|
import me.zhyd.oauth.config.AuthConfig;
|
||||||
|
import me.zhyd.oauth.utils.UrlBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领英授权
|
||||||
|
*
|
||||||
|
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
||||||
|
* @version 1.0
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
public class LinkedinAuthorization implements Authorization {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAuthorizeUrl(AuthConfig config) {
|
||||||
|
return UrlBuilder.getLinkedinAuthorizeUrl(config.getClientId(), config.getRedirectUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -445,6 +445,64 @@ public enum ApiUrl {
|
|||||||
public String refresh() {
|
public String refresh() {
|
||||||
throw new AuthException(ResponseStatus.UNSUPPORTED);
|
throw new AuthException(ResponseStatus.UNSUPPORTED);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 抖音
|
||||||
|
*/
|
||||||
|
DOUYIN {
|
||||||
|
@Override
|
||||||
|
public String authorize() {
|
||||||
|
return "https://open.douyin.com/platform/oauth/connect";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String accessToken() {
|
||||||
|
return "https://open.douyin.com/oauth/access_token";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String userInfo() {
|
||||||
|
return "https://open.douyin.com/oauth/userinfo";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String revoke() {
|
||||||
|
throw new AuthException(ResponseStatus.UNSUPPORTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String refresh() {
|
||||||
|
return "https://open.douyin.com/oauth/refresh_token";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 领英
|
||||||
|
*/
|
||||||
|
LINKEDIN {
|
||||||
|
@Override
|
||||||
|
public String authorize() {
|
||||||
|
return "https://www.linkedin.com/oauth/v2/authorization";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String accessToken() {
|
||||||
|
return "https://www.linkedin.com/oauth/v2/accessToken";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String userInfo() {
|
||||||
|
return "https://api.linkedin.com/v2/me";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String revoke() {
|
||||||
|
throw new AuthException(ResponseStatus.UNSUPPORTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String refresh() {
|
||||||
|
return "https://www.linkedin.com/oauth/v2/accessToken";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -28,4 +28,13 @@ public class AuthResponse<T> {
|
|||||||
* 授权响应数据,当且仅当 code = 2000 时返回
|
* 授权响应数据,当且仅当 code = 2000 时返回
|
||||||
*/
|
*/
|
||||||
private T data;
|
private T data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否请求成功
|
||||||
|
*
|
||||||
|
* @return true or false
|
||||||
|
*/
|
||||||
|
public boolean ok() {
|
||||||
|
return this.code == ResponseStatus.SUCCESS.getCode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,4 +23,6 @@ public enum AuthSource {
|
|||||||
WECHAT,
|
WECHAT,
|
||||||
GOOGLE,
|
GOOGLE,
|
||||||
FACEBOOK,
|
FACEBOOK,
|
||||||
|
DOUYIN,
|
||||||
|
LINKEDIN,
|
||||||
}
|
}
|
||||||
|
|||||||
98
src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java
Normal file
98
src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
package me.zhyd.oauth.request;
|
||||||
|
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import cn.hutool.http.HttpResponse;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import me.zhyd.oauth.config.AuthConfig;
|
||||||
|
import me.zhyd.oauth.exception.AuthException;
|
||||||
|
import me.zhyd.oauth.model.AuthResponse;
|
||||||
|
import me.zhyd.oauth.model.AuthSource;
|
||||||
|
import me.zhyd.oauth.model.AuthToken;
|
||||||
|
import me.zhyd.oauth.model.AuthUser;
|
||||||
|
import me.zhyd.oauth.utils.UrlBuilder;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抖音登录
|
||||||
|
*
|
||||||
|
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
||||||
|
* @version 1.0
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
public class AuthDouyinRequest extends BaseAuthRequest {
|
||||||
|
|
||||||
|
public AuthDouyinRequest(AuthConfig config) {
|
||||||
|
super(config, AuthSource.DOUYIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AuthToken getAccessToken(String code) {
|
||||||
|
String accessTokenUrl = UrlBuilder.getDouyinAccessTokenUrl(config.getClientId(), config.getClientSecret(), code);
|
||||||
|
return this.getToken(accessTokenUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AuthUser getUserInfo(AuthToken authToken) {
|
||||||
|
String accessToken = authToken.getAccessToken();
|
||||||
|
String openId = authToken.getOpenId();
|
||||||
|
HttpResponse response = HttpRequest.get(UrlBuilder.getDouyinUserInfoUrl(accessToken, openId)).execute();
|
||||||
|
JSONObject object = JSONObject.parseObject(response.body());
|
||||||
|
|
||||||
|
JSONObject userInfoObject = this.checkResponse(object);
|
||||||
|
|
||||||
|
return AuthUser.builder()
|
||||||
|
.uuid(userInfoObject.getString("open_id"))
|
||||||
|
.username(userInfoObject.getString("nickname"))
|
||||||
|
.nickname(userInfoObject.getString("nickname"))
|
||||||
|
.avatar(userInfoObject.getString("avatar"))
|
||||||
|
.token(authToken)
|
||||||
|
.source(AuthSource.DOUYIN)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuthResponse refresh(AuthToken oldToken) {
|
||||||
|
String refreshTokenUrl = UrlBuilder.getDouyinRefreshUrl(config.getClientId(), oldToken.getRefreshToken());
|
||||||
|
return AuthResponse.builder()
|
||||||
|
.code(ResponseStatus.SUCCESS.getCode())
|
||||||
|
.data(this.getToken(refreshTokenUrl))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查响应内容是否正确
|
||||||
|
*
|
||||||
|
* @param object 请求响应内容
|
||||||
|
* @return 实际请求数据的json对象
|
||||||
|
*/
|
||||||
|
private JSONObject checkResponse(JSONObject object) {
|
||||||
|
String message = object.getString("message");
|
||||||
|
JSONObject data = object.getJSONObject("data");
|
||||||
|
int errorCode = data.getIntValue("error_code");
|
||||||
|
if ("error".equals(message) || errorCode != 0) {
|
||||||
|
throw new AuthException(errorCode, data.getString("description"));
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取token,适用于获取access_token和刷新token
|
||||||
|
*
|
||||||
|
* @param accessTokenUrl 实际请求token的地址
|
||||||
|
* @return token对象
|
||||||
|
*/
|
||||||
|
private AuthToken getToken(String accessTokenUrl) {
|
||||||
|
HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
|
||||||
|
String accessTokenStr = response.body();
|
||||||
|
JSONObject object = JSONObject.parseObject(accessTokenStr);
|
||||||
|
|
||||||
|
JSONObject accessTokenObject = this.checkResponse(object);
|
||||||
|
return AuthToken.builder()
|
||||||
|
.accessToken(accessTokenObject.getString("access_token"))
|
||||||
|
.openId(accessTokenObject.getString("open_id"))
|
||||||
|
.expireIn(accessTokenObject.getIntValue("expires_in"))
|
||||||
|
.refreshToken(accessTokenObject.getString("refresh_token"))
|
||||||
|
.scope(accessTokenObject.getString("scope"))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
152
src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
Normal file
152
src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
package me.zhyd.oauth.request;
|
||||||
|
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import cn.hutool.http.HttpResponse;
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import me.zhyd.oauth.config.AuthConfig;
|
||||||
|
import me.zhyd.oauth.exception.AuthException;
|
||||||
|
import me.zhyd.oauth.model.AuthResponse;
|
||||||
|
import me.zhyd.oauth.model.AuthSource;
|
||||||
|
import me.zhyd.oauth.model.AuthToken;
|
||||||
|
import me.zhyd.oauth.model.AuthUser;
|
||||||
|
import me.zhyd.oauth.utils.StringUtils;
|
||||||
|
import me.zhyd.oauth.utils.UrlBuilder;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领英登录
|
||||||
|
*
|
||||||
|
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
||||||
|
* @version 1.0
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
public class AuthLinkedinRequest extends BaseAuthRequest {
|
||||||
|
|
||||||
|
public AuthLinkedinRequest(AuthConfig config) {
|
||||||
|
super(config, AuthSource.LINKEDIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AuthToken getAccessToken(String code) {
|
||||||
|
String accessTokenUrl = UrlBuilder.getLinkedinAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri());
|
||||||
|
return this.getToken(accessTokenUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AuthUser getUserInfo(AuthToken authToken) {
|
||||||
|
String accessToken = authToken.getAccessToken();
|
||||||
|
HttpResponse response = HttpRequest.get(UrlBuilder.getLinkedinUserInfoUrl())
|
||||||
|
.header("Host", "api.linkedin.com")
|
||||||
|
.header("Connection", "Keep-Alive")
|
||||||
|
.header("Authorization", "Bearer " + accessToken)
|
||||||
|
.execute();
|
||||||
|
JSONObject userInfoObject = JSONObject.parseObject(response.body());
|
||||||
|
|
||||||
|
this.checkResponse(userInfoObject);
|
||||||
|
|
||||||
|
// 组装用户名
|
||||||
|
String firstName, lastName;
|
||||||
|
// 获取firstName
|
||||||
|
if (userInfoObject.containsKey("localizedFirstName")) {
|
||||||
|
firstName = userInfoObject.getString("localizedFirstName");
|
||||||
|
} else {
|
||||||
|
firstName = getUserName(userInfoObject, "firstName");
|
||||||
|
}
|
||||||
|
// 获取lastName
|
||||||
|
if (userInfoObject.containsKey("localizedLastName")) {
|
||||||
|
lastName = userInfoObject.getString("localizedLastName");
|
||||||
|
} else {
|
||||||
|
lastName = getUserName(userInfoObject, "lastName");
|
||||||
|
}
|
||||||
|
String userName = firstName + " " + lastName;
|
||||||
|
|
||||||
|
// 获取用户头像
|
||||||
|
String avatar = null;
|
||||||
|
JSONObject profilePictureObject = userInfoObject.getJSONObject("profilePicture");
|
||||||
|
if (profilePictureObject.containsKey("displayImage~")) {
|
||||||
|
JSONArray displayImageElements = profilePictureObject.getJSONObject("displayImage~").getJSONArray("elements");
|
||||||
|
if (null != displayImageElements && displayImageElements.size() > 0) {
|
||||||
|
JSONObject largestImageObj = displayImageElements.getJSONObject(displayImageElements.size() - 1);
|
||||||
|
avatar = largestImageObj.getJSONArray("identifiers").getJSONObject(0).getString("identifier");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取用户邮箱地址
|
||||||
|
String email = this.getUserEmail(accessToken);
|
||||||
|
return AuthUser.builder()
|
||||||
|
.uuid(userInfoObject.getString("id"))
|
||||||
|
.username(userName)
|
||||||
|
.nickname(userName)
|
||||||
|
.avatar(avatar)
|
||||||
|
.email(email)
|
||||||
|
.token(authToken)
|
||||||
|
.source(AuthSource.LINKEDIN)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getUserEmail(String accessToken) {
|
||||||
|
String email = null;
|
||||||
|
HttpResponse emailResponse = HttpRequest.get("https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))")
|
||||||
|
.header("Host", "api.linkedin.com")
|
||||||
|
.header("Connection", "Keep-Alive")
|
||||||
|
.header("Authorization", "Bearer " + accessToken)
|
||||||
|
.execute();
|
||||||
|
System.out.println(emailResponse.body());
|
||||||
|
JSONObject emailObj = JSONObject.parseObject(emailResponse.body());
|
||||||
|
if (emailObj.containsKey("elements")) {
|
||||||
|
email = emailObj.getJSONArray("elements").getJSONObject(0).getJSONObject("handle~").getString("emailAddress");
|
||||||
|
}
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getUserName(JSONObject userInfoObject, String nameKey) {
|
||||||
|
String firstName;
|
||||||
|
JSONObject firstNameObj = userInfoObject.getJSONObject(nameKey);
|
||||||
|
JSONObject localizedObj = firstNameObj.getJSONObject("localized");
|
||||||
|
JSONObject preferredLocaleObj = firstNameObj.getJSONObject("preferredLocale");
|
||||||
|
firstName = localizedObj.getString(preferredLocaleObj.getString("language") + "_" + preferredLocaleObj.getString("country"));
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuthResponse refresh(AuthToken oldToken) {
|
||||||
|
if (StringUtils.isEmpty(oldToken.getRefreshToken())) {
|
||||||
|
throw new AuthException(ResponseStatus.UNSUPPORTED);
|
||||||
|
}
|
||||||
|
String refreshTokenUrl = UrlBuilder.getLinkedinRefreshUrl(config.getClientId(), config.getClientSecret(), oldToken.getRefreshToken());
|
||||||
|
return AuthResponse.builder()
|
||||||
|
.code(ResponseStatus.SUCCESS.getCode())
|
||||||
|
.data(this.getToken(refreshTokenUrl))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkResponse(JSONObject userInfoObject) {
|
||||||
|
if (userInfoObject.containsKey("error")) {
|
||||||
|
throw new AuthException(userInfoObject.getString("error_description"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取token,适用于获取access_token和刷新token
|
||||||
|
*
|
||||||
|
* @param accessTokenUrl 实际请求token的地址
|
||||||
|
* @return token对象
|
||||||
|
*/
|
||||||
|
private AuthToken getToken(String accessTokenUrl) {
|
||||||
|
HttpResponse response = HttpRequest.post(accessTokenUrl)
|
||||||
|
.header("Host", "www.linkedin.com")
|
||||||
|
.header("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
.execute();
|
||||||
|
String accessTokenStr = response.body();
|
||||||
|
JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr);
|
||||||
|
|
||||||
|
this.checkResponse(accessTokenObject);
|
||||||
|
|
||||||
|
return AuthToken.builder()
|
||||||
|
.accessToken(accessTokenObject.getString("access_token"))
|
||||||
|
.expireIn(accessTokenObject.getIntValue("expires_in"))
|
||||||
|
.refreshToken(accessTokenObject.getString("refresh_token"))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -29,16 +29,7 @@ public class AuthWeChatRequest extends BaseAuthRequest {
|
|||||||
@Override
|
@Override
|
||||||
protected AuthToken getAccessToken(String code) {
|
protected AuthToken getAccessToken(String code) {
|
||||||
String accessTokenUrl = UrlBuilder.getWeChatAccessTokenUrl(config.getClientId(), config.getClientSecret(), code);
|
String accessTokenUrl = UrlBuilder.getWeChatAccessTokenUrl(config.getClientId(), config.getClientSecret(), code);
|
||||||
HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
|
return this.getToken(accessTokenUrl);
|
||||||
JSONObject object = JSONObject.parseObject(response.body());
|
|
||||||
if (!object.containsKey("access_token") || !object.containsKey("openid") || !object.containsKey("refresh_token")) {
|
|
||||||
throw new AuthException("Unable to get access_token or openid or refresh_token from wechat using code [" + code + "]");
|
|
||||||
}
|
|
||||||
return AuthToken.builder()
|
|
||||||
.accessToken(object.getString("access_token"))
|
|
||||||
.refreshToken(object.getString("refresh_token"))
|
|
||||||
.openId(object.getString("openid"))
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -48,9 +39,8 @@ public class AuthWeChatRequest extends BaseAuthRequest {
|
|||||||
|
|
||||||
HttpResponse response = HttpRequest.get(UrlBuilder.getWeChatUserInfoUrl(accessToken, openId)).execute();
|
HttpResponse response = HttpRequest.get(UrlBuilder.getWeChatUserInfoUrl(accessToken, openId)).execute();
|
||||||
JSONObject object = JSONObject.parseObject(response.body());
|
JSONObject object = JSONObject.parseObject(response.body());
|
||||||
if (object.containsKey("errcode")) {
|
|
||||||
throw new AuthException(object.getString("errmsg"));
|
this.checkResponse(object);
|
||||||
}
|
|
||||||
|
|
||||||
return AuthUser.builder()
|
return AuthUser.builder()
|
||||||
.username(object.getString("nickname"))
|
.username(object.getString("nickname"))
|
||||||
@ -65,16 +55,41 @@ public class AuthWeChatRequest extends BaseAuthRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AuthResponse refresh(AuthToken authToken) {
|
public AuthResponse refresh(AuthToken oldToken) {
|
||||||
String refreshToken = authToken.getRefreshToken();
|
String refreshTokenUrl = UrlBuilder.getWeChatRefreshUrl(config.getClientId(), oldToken.getRefreshToken());
|
||||||
HttpResponse response = HttpRequest.get(UrlBuilder.getWeChatRefreshUrl(config.getClientId(), refreshToken))
|
return AuthResponse.builder()
|
||||||
.execute();
|
.code(ResponseStatus.SUCCESS.getCode())
|
||||||
|
.data(this.getToken(refreshTokenUrl))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
JSONObject object = JSONObject.parseObject(response.body());
|
/**
|
||||||
|
* 检查响应内容是否正确
|
||||||
|
*
|
||||||
|
* @param object 请求响应内容
|
||||||
|
*/
|
||||||
|
private void checkResponse(JSONObject object) {
|
||||||
if (object.containsKey("errcode")) {
|
if (object.containsKey("errcode")) {
|
||||||
throw new AuthException(object.getString("errmsg"));
|
throw new AuthException(object.getIntValue("errcode"), object.getString("errmsg"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取token,适用于获取access_token和刷新token
|
||||||
|
*
|
||||||
|
* @param accessTokenUrl 实际请求token的地址
|
||||||
|
* @return token对象
|
||||||
|
*/
|
||||||
|
private AuthToken getToken(String accessTokenUrl) {
|
||||||
|
HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
|
||||||
|
JSONObject object = JSONObject.parseObject(response.body());
|
||||||
|
|
||||||
return AuthResponse.builder().data(object).build();
|
this.checkResponse(object);
|
||||||
|
|
||||||
|
return AuthToken.builder()
|
||||||
|
.accessToken(object.getString("access_token"))
|
||||||
|
.refreshToken(object.getString("refresh_token"))
|
||||||
|
.expireIn(object.getIntValue("expires_in"))
|
||||||
|
.openId(object.getString("openid"))
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,13 +35,22 @@ public abstract class BaseAuthRequest implements AuthRequest {
|
|||||||
@Override
|
@Override
|
||||||
public AuthResponse login(String code) {
|
public AuthResponse login(String code) {
|
||||||
try {
|
try {
|
||||||
AuthUser user = this.getUserInfo(this.getAccessToken(code));
|
AuthToken authToken = this.getAccessToken(code);
|
||||||
|
AuthUser user = this.getUserInfo(authToken);
|
||||||
return AuthResponse.builder().code(ResponseStatus.SUCCESS.getCode()).data(user).build();
|
return AuthResponse.builder().code(ResponseStatus.SUCCESS.getCode()).data(user).build();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return AuthResponse.builder().code(ResponseStatus.FAILURE.getCode()).msg(e.getMessage()).build();
|
return this.responseError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private AuthResponse responseError(Exception e) {
|
||||||
|
int errorCode = ResponseStatus.FAILURE.getCode();
|
||||||
|
if (e instanceof AuthException) {
|
||||||
|
errorCode = ((AuthException) e).getErrorCode();
|
||||||
|
}
|
||||||
|
return AuthResponse.builder().code(errorCode).msg(e.getMessage()).build();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String authorize() {
|
public String authorize() {
|
||||||
return AuthorizationFactory.getAuthorize(source).getAuthorizeUrl(config);
|
return AuthorizationFactory.getAuthorize(source).getAuthorizeUrl(config);
|
||||||
|
|||||||
@ -72,6 +72,11 @@ public class UrlBuilder {
|
|||||||
private static final String FACEBOOK_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";
|
private static final String FACEBOOK_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";
|
||||||
private static final String FACEBOOK_USER_INFO_PATTERN = "{0}?access_token={1}&fields=id,name,birthday,gender,hometown,email,devices,picture.width(400)";
|
private static final String FACEBOOK_USER_INFO_PATTERN = "{0}?access_token={1}&fields=id,name,birthday,gender,hometown,email,devices,picture.width(400)";
|
||||||
|
|
||||||
|
private static final String DOUYIN_AUTHORIZE_PATTERN = "{0}?client_key={1}&redirect_uri={2}&state={3}&response_type=code&scope=user_info";
|
||||||
|
private static final String DOUYIN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&grant_type=authorization_code";
|
||||||
|
private static final String DOUYIN_USER_INFO_PATTERN = "{0}?access_token={1}&open_id={2}";
|
||||||
|
private static final String DOUYIN_REFRESH_TOKEN_PATTERN = "{0}?client_key={1}&refresh_token={2}&grant_type=refresh_token";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取githubtoken的接口地址
|
* 获取githubtoken的接口地址
|
||||||
*
|
*
|
||||||
@ -569,4 +574,101 @@ public class UrlBuilder {
|
|||||||
public static String getFacebookUserInfoUrl(String token) {
|
public static String getFacebookUserInfoUrl(String token) {
|
||||||
return MessageFormat.format(FACEBOOK_USER_INFO_PATTERN, ApiUrl.FACEBOOK.userInfo(), token);
|
return MessageFormat.format(FACEBOOK_USER_INFO_PATTERN, ApiUrl.FACEBOOK.userInfo(), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Douyin授权地址
|
||||||
|
*
|
||||||
|
* @param clientId Douyin 应用的Client ID
|
||||||
|
* @param redirectUrl Douyin 应用授权成功后的回调地址
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getDouyinAuthorizeUrl(String clientId, String redirectUrl) {
|
||||||
|
return MessageFormat.format(DOUYIN_AUTHORIZE_PATTERN, ApiUrl.DOUYIN.authorize(), clientId, redirectUrl, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Douyin token的接口地址
|
||||||
|
*
|
||||||
|
* @param clientId Douyin 应用的Client ID
|
||||||
|
* @param clientSecret Douyin 应用的Client Secret
|
||||||
|
* @param code Douyin 授权前的code,用来换token
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getDouyinAccessTokenUrl(String clientId, String clientSecret, String code) {
|
||||||
|
return MessageFormat.format(DOUYIN_ACCESS_TOKEN_PATTERN, ApiUrl.DOUYIN.accessToken(), clientId, clientSecret, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Douyin用户详情的接口地址
|
||||||
|
*
|
||||||
|
* @param token Douyin 应用的token
|
||||||
|
* @param openId 用户在当前应用的唯一标识 通过token接口获取
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getDouyinUserInfoUrl(String token, String openId) {
|
||||||
|
return MessageFormat.format(DOUYIN_USER_INFO_PATTERN, ApiUrl.DOUYIN.userInfo(), token, openId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Douyin 刷新令牌 地址
|
||||||
|
*
|
||||||
|
* @param clientId Douyin应用的client_key
|
||||||
|
* @param refreshToken Douyin应用返回的refresh_token
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getDouyinRefreshUrl(String clientId, String refreshToken) {
|
||||||
|
return MessageFormat.format(DOUYIN_REFRESH_TOKEN_PATTERN, ApiUrl.DOUYIN.refresh(), clientId, refreshToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static final String LINKEDIN_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code&scope=r_liteprofile%20r_emailaddress%20w_member_social";
|
||||||
|
private static final String LINKEDIN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";
|
||||||
|
private static final String LINKEDIN_USER_INFO_PATTERN = "{0}?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))";
|
||||||
|
private static final String LINKEDIN_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&refresh_token={3}&grant_type=refresh_token";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Linkedin授权地址
|
||||||
|
*
|
||||||
|
* @param clientId Linkedin 应用的Client ID
|
||||||
|
* @param redirectUrl Linkedin 应用授权成功后的回调地址
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getLinkedinAuthorizeUrl(String clientId, String redirectUrl) {
|
||||||
|
return MessageFormat.format(LINKEDIN_AUTHORIZE_PATTERN, ApiUrl.LINKEDIN.authorize(), clientId, redirectUrl, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Linkedin token的接口地址
|
||||||
|
*
|
||||||
|
* @param clientId Linkedin 应用的Client ID
|
||||||
|
* @param clientSecret Linkedin 应用的Client Secret
|
||||||
|
* @param code Linkedin 授权前的code,用来换token
|
||||||
|
* @param redirectUrl google 应用授权成功后的回调地址
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getLinkedinAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUrl) {
|
||||||
|
return MessageFormat.format(LINKEDIN_ACCESS_TOKEN_PATTERN, ApiUrl.LINKEDIN.accessToken(), clientId, clientSecret, code, redirectUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Linkedin用户详情的接口地址
|
||||||
|
*
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getLinkedinUserInfoUrl() {
|
||||||
|
return MessageFormat.format(LINKEDIN_USER_INFO_PATTERN, ApiUrl.LINKEDIN.userInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Linkedin 刷新令牌 地址
|
||||||
|
*
|
||||||
|
* @param clientId Linkedin应用的client_key
|
||||||
|
* @param clientSecret Linkedin 应用的Client Secret
|
||||||
|
* @param refreshToken Linkedin应用返回的refresh_token
|
||||||
|
* @return full url
|
||||||
|
*/
|
||||||
|
public static String getLinkedinRefreshUrl(String clientId, String clientSecret, String refreshToken) {
|
||||||
|
return MessageFormat.format(LINKEDIN_REFRESH_TOKEN_PATTERN, ApiUrl.LINKEDIN.refresh(), clientId, clientSecret, refreshToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user