Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
justauth
JustAuth
提交
b67483c2
J
JustAuth
项目概览
justauth
/
JustAuth
1 年多 前同步成功
通知
391
Star
15212
Fork
2708
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JustAuth
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
未验证
提交
b67483c2
编写于
7月 18, 2019
作者:
智布道
👁
提交者:
GitHub
7月 18, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #21 from pengisgood/dev
Integrate Stack Overflow
上级
44d4323f
66ee684e
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
170 addition
and
11 deletion
+170
-11
README.md
README.md
+2
-1
example.md
example.md
+13
-5
src/main/java/me/zhyd/oauth/config/AuthConfig.java
src/main/java/me/zhyd/oauth/config/AuthConfig.java
+7
-0
src/main/java/me/zhyd/oauth/config/AuthSource.java
src/main/java/me/zhyd/oauth/config/AuthSource.java
+20
-0
src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
+1
-1
src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java
...main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java
+4
-4
src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java
.../java/me/zhyd/oauth/request/AuthStackOverflowRequest.java
+68
-0
src/main/java/me/zhyd/oauth/url/AuthStackOverflowUrlBuilder.java
...n/java/me/zhyd/oauth/url/AuthStackOverflowUrlBuilder.java
+48
-0
src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java
src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java
+7
-0
未找到文件。
README.md
浏览文件 @
b67483c2
...
...
@@ -48,6 +48,7 @@
<td
align=
"center"
width=
"200"
><a
href=
"#授权Teambition"
><img
src=
"https://gitee.com/yadong.zhang/static/raw/master/JustAuth/teambition.png"
width=
"20"
></a></td>
<td
align=
"center"
width=
"200"
><a
href=
"#授权人人"
><img
src=
"https://gitee.com/yadong.zhang/static/raw/master/JustAuth/renren.png"
width=
"20"
></a></td>
<td
align=
"center"
width=
"200"
><a
href=
"#授权Pinterest"
><img
src=
"https://gitee.com/yadong.zhang/static/raw/master/JustAuth/pinterest.png"
width=
"20"
></a></td>
<td
align=
"center"
width=
"200"
><a
href=
"#授权Stack Overflow"
><img
src=
""
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>
</table>
...
...
@@ -178,4 +179,4 @@ _请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经
| 支付宝 | 微信 |
| :------------: | :------------: |
|
<img
src=
"https://gitee.com/yadong.zhang/static/raw/master/qrcode/zfb_code.png"
width=
"200"
/>
|
<img
src=
"https://gitee.com/yadong.zhang/static/raw/master/qrcode/wx_code.png"
width=
"200"
/>
|
\ No newline at end of file
|
<img
src=
"https://gitee.com/yadong.zhang/static/raw/master/qrcode/zfb_code.png"
width=
"200"
/>
|
<img
src=
"https://gitee.com/yadong.zhang/static/raw/master/qrcode/wx_code.png"
width=
"200"
/>
|
example.md
浏览文件 @
b67483c2
...
...
@@ -80,10 +80,6 @@ _注:非全部平台,部分平台可能不存在图例_
暂无
#### 授权csdn
暂无
#### 授权Pinterest
![
授权Pinterest
](
https://images.gitee.com/uploads/images/2019/0718/155012_6290f500_784199.jpeg
"在这里输入图片标题"
)
...
...
@@ -92,4 +88,16 @@ _注:非全部平台,部分平台可能不存在图例_
![
授权Renre
](
https://images.gitee.com/uploads/images/2019/0718/155035_8e26c10a_784199.jpeg
"在这里输入图片标题"
)
_请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_
\ No newline at end of file
#### 授权Stack Overflow
暂无
#### 授权Twitter
暂无
#### 授权csdn
暂无
_请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_
src/main/java/me/zhyd/oauth/config/AuthConfig.java
浏览文件 @
b67483c2
...
...
@@ -51,4 +51,11 @@ public class AuthConfig {
* 1.8.0版本新增参数
*/
private
String
state
;
/**
* Stack Overflow Key
* <p>
* 1.9.0版本新增参数
*/
private
String
stackOverflowKey
;
}
src/main/java/me/zhyd/oauth/config/AuthSource.java
浏览文件 @
b67483c2
...
...
@@ -489,6 +489,26 @@ public enum AuthSource {
public
String
userInfo
()
{
return
"https://api.pinterest.com/v1/me"
;
}
},
/**
* Stack Overflow
*/
STACK_OVERFLOW
{
@Override
public
String
authorize
()
{
return
"https://stackoverflow.com/oauth"
;
}
@Override
public
String
accessToken
()
{
return
"https://stackoverflow.com/oauth/access_token/json"
;
}
@Override
public
String
userInfo
()
{
return
"https://api.stackexchange.com/2.2/me"
;
}
};
/**
...
...
src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
浏览文件 @
b67483c2
...
...
@@ -140,7 +140,7 @@ public class AuthLinkedinRequest extends AuthDefaultRequest {
private
AuthToken
getToken
(
String
accessTokenUrl
)
{
HttpResponse
response
=
HttpRequest
.
post
(
accessTokenUrl
)
.
header
(
"Host"
,
"www.linkedin.com"
)
.
header
(
"Content-Type"
,
"application/x-www-form-urlencoded"
)
.
contentType
(
"application/x-www-form-urlencoded"
)
.
execute
();
String
accessTokenStr
=
response
.
body
();
JSONObject
accessTokenObject
=
JSONObject
.
parseObject
(
accessTokenStr
);
...
...
src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java
浏览文件 @
b67483c2
...
...
@@ -14,6 +14,8 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity;
import
java.util.HashMap
;
import
java.util.Map
;
import
static
me
.
zhyd
.
oauth
.
utils
.
GlobalAuthUtil
.
parseQueryToMap
;
/**
* 微软登录
*
...
...
@@ -40,12 +42,10 @@ public class AuthMicrosoftRequest extends AuthDefaultRequest {
* @return token对象
*/
private
AuthToken
getToken
(
String
accessTokenUrl
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>(
6
);
HttpUtil
.
decodeParamMap
(
accessTokenUrl
,
"UTF-8"
).
forEach
(
paramMap:
:
put
);
HttpResponse
response
=
HttpRequest
.
post
(
accessTokenUrl
)
.
header
(
"Host"
,
"https://login.microsoftonline.com"
)
.
header
(
"Content-Type"
,
"application/x-www-form-urlencoded"
)
.
form
(
par
amMap
)
.
contentType
(
"application/x-www-form-urlencoded"
)
.
form
(
par
seQueryToMap
(
accessTokenUrl
)
)
.
execute
();
String
accessTokenStr
=
response
.
body
();
JSONObject
accessTokenObject
=
JSONObject
.
parseObject
(
accessTokenStr
);
...
...
src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java
0 → 100644
浏览文件 @
b67483c2
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.AuthCallback
;
import
me.zhyd.oauth.model.AuthToken
;
import
me.zhyd.oauth.model.AuthUser
;
import
me.zhyd.oauth.model.AuthUserGender
;
import
me.zhyd.oauth.url.AuthStackOverflowUrlBuilder
;
import
me.zhyd.oauth.url.entity.AuthUserInfoEntity
;
import
static
me
.
zhyd
.
oauth
.
config
.
AuthSource
.
STACK_OVERFLOW
;
import
static
me
.
zhyd
.
oauth
.
utils
.
GlobalAuthUtil
.
parseQueryToMap
;
/**
* Stack Overflow登录
*
* @author hongwei.peng (pengisgood(at)gmail(dot)com)
* @version 1.9.0
* @since 1.9.0
*/
public
class
AuthStackOverflowRequest
extends
AuthDefaultRequest
{
public
AuthStackOverflowRequest
(
AuthConfig
config
)
{
super
(
config
,
STACK_OVERFLOW
,
new
AuthStackOverflowUrlBuilder
());
}
@Override
protected
AuthToken
getAccessToken
(
AuthCallback
authCallback
)
{
String
accessTokenUrl
=
this
.
urlBuilder
.
getAccessTokenUrl
(
authCallback
.
getCode
());
HttpResponse
response
=
HttpRequest
.
post
(
accessTokenUrl
)
.
contentType
(
"application/x-www-form-urlencoded"
)
.
form
(
parseQueryToMap
(
accessTokenUrl
))
.
execute
();
JSONObject
accessTokenObject
=
JSONObject
.
parseObject
(
response
.
body
());
if
(!
response
.
isOk
())
{
throw
new
AuthException
(
"Unable to get token from Stack Overflow using code ["
+
authCallback
.
getCode
()
+
"]: "
+
accessTokenObject
);
}
return
AuthToken
.
builder
()
.
accessToken
(
accessTokenObject
.
getString
(
"access_token"
))
.
expireIn
(
accessTokenObject
.
getIntValue
(
"expires"
))
.
build
();
}
@Override
protected
AuthUser
getUserInfo
(
AuthToken
authToken
)
{
String
accessToken
=
authToken
.
getAccessToken
();
HttpResponse
response
=
HttpRequest
.
get
(
this
.
urlBuilder
.
getUserInfoUrl
(
AuthUserInfoEntity
.
builder
()
.
accessToken
(
accessToken
)
.
build
())).
execute
();
JSONObject
userObj
=
JSONObject
.
parseObject
(
response
.
body
()).
getJSONArray
(
"items"
).
getJSONObject
(
0
);
return
AuthUser
.
builder
()
.
uuid
(
userObj
.
getString
(
"user_id"
))
.
avatar
(
userObj
.
getString
(
"profile_image"
))
.
location
(
userObj
.
getString
(
"location"
))
.
nickname
(
userObj
.
getString
(
"display_name"
))
.
blog
(
userObj
.
getString
(
"website_url"
))
.
gender
(
AuthUserGender
.
UNKNOWN
)
.
token
(
authToken
)
.
source
(
STACK_OVERFLOW
)
.
build
();
}
}
src/main/java/me/zhyd/oauth/url/AuthStackOverflowUrlBuilder.java
0 → 100644
浏览文件 @
b67483c2
package
me.zhyd.oauth.url
;
import
me.zhyd.oauth.exception.AuthException
;
import
me.zhyd.oauth.model.AuthResponseStatus
;
import
me.zhyd.oauth.url.entity.AuthUserInfoEntity
;
import
java.text.MessageFormat
;
import
static
me
.
zhyd
.
oauth
.
config
.
AuthSource
.
STACK_OVERFLOW
;
/**
* Stack Overflow相关的URL构建类
*
* @author hongwei.peng (pengisgood(at)gmail(dot)com)
* @version 1.9.0
* @since 1.9.0
*/
public
class
AuthStackOverflowUrlBuilder
extends
AuthDefaultUrlBuilder
{
private
static
final
String
SO_ACCESS_TOKEN_PATTERN
=
"{0}?client_id={1}&client_secret={2}&redirect_uri={3}&code={4}"
;
private
static
final
String
SO_USER_INFO_PATTERN
=
"{0}?access_token={1}&site=stackoverflow&key={2}"
;
private
static
final
String
SO_AUTHORIZE_PATTERN
=
"{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"
;
@Override
public
String
getAccessTokenUrl
(
String
code
)
{
return
MessageFormat
.
format
(
SO_ACCESS_TOKEN_PATTERN
,
STACK_OVERFLOW
.
accessToken
(),
config
.
getClientId
(),
config
.
getClientSecret
(),
config
.
getRedirectUri
(),
code
);
}
@Override
public
String
getUserInfoUrl
(
AuthUserInfoEntity
userInfoEntity
)
{
return
MessageFormat
.
format
(
SO_USER_INFO_PATTERN
,
STACK_OVERFLOW
.
userInfo
(),
userInfoEntity
.
getAccessToken
(),
config
.
getStackOverflowKey
());
}
@Override
public
String
getAuthorizeUrl
()
{
return
MessageFormat
.
format
(
SO_AUTHORIZE_PATTERN
,
STACK_OVERFLOW
.
authorize
(),
config
.
getClientId
(),
config
.
getRedirectUri
(),
this
.
getRealState
(
config
.
getState
()));
}
@Override
public
String
getRefreshUrl
(
String
refreshToken
)
{
throw
new
AuthException
(
AuthResponseStatus
.
UNSUPPORTED
);
}
@Override
public
String
getRevokeUrl
(
String
accessToken
)
{
throw
new
AuthException
(
AuthResponseStatus
.
UNSUPPORTED
);
}
}
src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java
浏览文件 @
b67483c2
package
me.zhyd.oauth.utils
;
import
cn.hutool.core.codec.Base64
;
import
cn.hutool.http.HttpUtil
;
import
me.zhyd.oauth.exception.AuthException
;
import
javax.crypto.Mac
;
...
...
@@ -82,6 +83,12 @@ public class GlobalAuthUtil {
return
res
;
}
public
static
Map
<
String
,
Object
>
parseQueryToMap
(
String
url
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
HttpUtil
.
decodeParamMap
(
url
,
"UTF-8"
).
forEach
(
paramMap:
:
put
);
return
paramMap
;
}
public
static
boolean
isHttpProtocol
(
String
url
)
{
if
(
StringUtils
.
isEmpty
(
url
))
{
return
false
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录