|
|
@@ -47,6 +47,7 @@ type OauthCacheItem struct {
|
|
47
|
47
|
Name string `json:"name"`
|
|
48
|
48
|
Email string `json:"email"`
|
|
49
|
49
|
Verifier string `json:"verifier"` // used for oauth pkce
|
|
|
50
|
+ Nonce string `json:"nonce"`
|
|
50
|
51
|
}
|
|
51
|
52
|
|
|
52
|
53
|
func (oci *OauthCacheItem) ToOauthUser() *model.OauthUser {
|
|
|
@@ -93,17 +94,22 @@ func (os *OauthService) DeleteOauthCache(key string) {
|
|
93
|
94
|
OauthCache.Delete(key)
|
|
94
|
95
|
}
|
|
95
|
96
|
|
|
96
|
|
-func (os *OauthService) BeginAuth(op string) (error error, state, verifier, url string) {
|
|
|
97
|
+func (os *OauthService) BeginAuth(op string) (error error, state, verifier, nonce, url string) {
|
|
97
|
98
|
state = utils.RandomString(10) + strconv.FormatInt(time.Now().Unix(), 10)
|
|
98
|
99
|
verifier = ""
|
|
|
100
|
+ nonce = ""
|
|
99
|
101
|
if op == model.OauthTypeWebauth {
|
|
100
|
102
|
url = global.Config.Rustdesk.ApiServer + "/_admin/#/oauth/" + state
|
|
101
|
103
|
//url = "http://localhost:8888/_admin/#/oauth/" + code
|
|
102
|
|
- return nil, state, verifier, url
|
|
|
104
|
+ return nil, state, verifier, nonce, url
|
|
103
|
105
|
}
|
|
104
|
106
|
err, oauthInfo, oauthConfig, _ := os.GetOauthConfig(op)
|
|
105
|
107
|
if err == nil {
|
|
106
|
108
|
extras := make([]oauth2.AuthCodeOption, 0, 3)
|
|
|
109
|
+
|
|
|
110
|
+ nonce = utils.RandomString(10)
|
|
|
111
|
+ extras = append(extras, oauth2.SetAuthURLParam("nonce", nonce))
|
|
|
112
|
+
|
|
107
|
113
|
if oauthInfo.PkceEnable != nil && *oauthInfo.PkceEnable {
|
|
108
|
114
|
extras = append(extras, oauth2.AccessTypeOffline)
|
|
109
|
115
|
verifier = oauth2.GenerateVerifier()
|
|
|
@@ -115,10 +121,11 @@ func (os *OauthService) BeginAuth(op string) (error error, state, verifier, url
|
|
115
|
121
|
extras = append(extras, oauth2.SetAuthURLParam("code_challenge_method", "plain"), oauth2.SetAuthURLParam("code_challenge", verifier))
|
|
116
|
122
|
}
|
|
117
|
123
|
}
|
|
118
|
|
- return err, state, verifier, oauthConfig.AuthCodeURL(state, extras...)
|
|
|
124
|
+
|
|
|
125
|
+ return err, state, verifier, nonce, oauthConfig.AuthCodeURL(state, extras...)
|
|
119
|
126
|
}
|
|
120
|
127
|
|
|
121
|
|
- return err, state, verifier, ""
|
|
|
128
|
+ return err, state, verifier, nonce, ""
|
|
122
|
129
|
}
|
|
123
|
130
|
|
|
124
|
131
|
func (os *OauthService) FetchOidcProvider(issuer string) (error, *oidc.Provider) {
|
|
|
@@ -280,9 +287,9 @@ func (os *OauthService) callbackBase(oauthConfig *oauth2.Config, provider *oidc.
|
|
280
|
287
|
}
|
|
281
|
288
|
|
|
282
|
289
|
// githubCallback github回调
|
|
283
|
|
-func (os *OauthService) githubCallback(oauthConfig *oauth2.Config, provider *oidc.Provider, code string, verifier string) (error, *model.OauthUser) {
|
|
|
290
|
+func (os *OauthService) githubCallback(oauthConfig *oauth2.Config, provider *oidc.Provider, code, verifier, nonce string) (error, *model.OauthUser) {
|
|
284
|
291
|
var user = &model.GithubUser{}
|
|
285
|
|
- err, client := os.callbackBase(oauthConfig, provider, code, verifier, "", user)
|
|
|
292
|
+ err, client := os.callbackBase(oauthConfig, provider, code, verifier, nonce, user)
|
|
286
|
293
|
if err != nil {
|
|
287
|
294
|
return err, nil
|
|
288
|
295
|
}
|
|
|
@@ -294,16 +301,16 @@ func (os *OauthService) githubCallback(oauthConfig *oauth2.Config, provider *oid
|
|
294
|
301
|
}
|
|
295
|
302
|
|
|
296
|
303
|
// oidcCallback oidc回调, 通过code获取用户信息
|
|
297
|
|
-func (os *OauthService) oidcCallback(oauthConfig *oauth2.Config, provider *oidc.Provider, code string, verifier string) (error, *model.OauthUser) {
|
|
|
304
|
+func (os *OauthService) oidcCallback(oauthConfig *oauth2.Config, provider *oidc.Provider, code, verifier, nonce string) (error, *model.OauthUser) {
|
|
298
|
305
|
var user = &model.OidcUser{}
|
|
299
|
|
- if err, _ := os.callbackBase(oauthConfig, provider, code, verifier, "", user); err != nil {
|
|
|
306
|
+ if err, _ := os.callbackBase(oauthConfig, provider, code, verifier, nonce, user); err != nil {
|
|
300
|
307
|
return err, nil
|
|
301
|
308
|
}
|
|
302
|
309
|
return nil, user.ToOauthUser()
|
|
303
|
310
|
}
|
|
304
|
311
|
|
|
305
|
312
|
// Callback: Get user information by code and op(Oauth provider)
|
|
306
|
|
-func (os *OauthService) Callback(code, verifier, op string) (err error, oauthUser *model.OauthUser) {
|
|
|
313
|
+func (os *OauthService) Callback(code, verifier, op, nonce string) (err error, oauthUser *model.OauthUser) {
|
|
307
|
314
|
err, oauthInfo, oauthConfig, provider := os.GetOauthConfig(op)
|
|
308
|
315
|
// oauthType is already validated in GetOauthConfig
|
|
309
|
316
|
if err != nil {
|
|
|
@@ -312,9 +319,9 @@ func (os *OauthService) Callback(code, verifier, op string) (err error, oauthUse
|
|
312
|
319
|
oauthType := oauthInfo.OauthType
|
|
313
|
320
|
switch oauthType {
|
|
314
|
321
|
case model.OauthTypeGithub:
|
|
315
|
|
- err, oauthUser = os.githubCallback(oauthConfig, provider, code, verifier)
|
|
|
322
|
+ err, oauthUser = os.githubCallback(oauthConfig, provider, code, verifier, nonce)
|
|
316
|
323
|
case model.OauthTypeOidc, model.OauthTypeGoogle:
|
|
317
|
|
- err, oauthUser = os.oidcCallback(oauthConfig, provider, code, verifier)
|
|
|
324
|
+ err, oauthUser = os.oidcCallback(oauthConfig, provider, code, verifier, nonce)
|
|
318
|
325
|
default:
|
|
319
|
326
|
return errors.New("unsupported OAuth type"), nil
|
|
320
|
327
|
}
|