Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
82259d13
"backend/cmd/git@web.lueluesay.top:chenxi/sub2api.git" did not exist on "9e0d12d3b03e6b1cc8cf96a0c59f6b0a288fab85"
Commit
82259d13
authored
Apr 22, 2026
by
IanShaw027
Browse files
fix(auth): preserve resolved token version on oauth login
parent
ca4e38aa
Changes
4
Hide whitespace changes
Inline
Side-by-side
backend/internal/handler/auth_oauth_pending_flow_test.go
View file @
82259d13
...
...
@@ -778,6 +778,14 @@ func TestExchangePendingOAuthCompletionExistingLoginWithSuggestedProfileSkipsAdo
require
.
Equal
(
t
,
"https://cdn.example/existing-login.png"
,
payload
[
"suggested_avatar_url"
])
require
.
NotContains
(
t
,
payload
,
"adoption_required"
)
accessToken
,
ok
:=
payload
[
"access_token"
]
.
(
string
)
require
.
True
(
t
,
ok
)
claims
,
err
:=
handler
.
authService
.
ValidateToken
(
accessToken
)
require
.
NoError
(
t
,
err
)
reloadedUser
,
err
:=
handler
.
userService
.
GetByID
(
ctx
,
userEntity
.
ID
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
reloadedUser
.
TokenVersion
,
claims
.
TokenVersion
)
decisionCount
,
err
:=
client
.
IdentityAdoptionDecision
.
Query
()
.
Where
(
identityadoptiondecision
.
PendingAuthSessionIDEQ
(
session
.
ID
))
.
Count
(
ctx
)
...
...
@@ -2033,6 +2041,13 @@ func TestLogin2FACompletesPendingOAuthBindAndConsumesSession(t *testing.T) {
payload
:=
decodeJSONResponseData
(
t
,
recorder
)
require
.
NotEmpty
(
t
,
payload
[
"access_token"
])
require
.
NotEmpty
(
t
,
payload
[
"refresh_token"
])
accessToken
,
ok
:=
payload
[
"access_token"
]
.
(
string
)
require
.
True
(
t
,
ok
)
claims
,
err
:=
handler
.
authService
.
ValidateToken
(
accessToken
)
require
.
NoError
(
t
,
err
)
reloadedUser
,
err
:=
handler
.
userService
.
GetByID
(
ctx
,
existingUser
.
ID
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
reloadedUser
.
TokenVersion
,
claims
.
TokenVersion
)
identity
,
err
:=
client
.
AuthIdentity
.
Query
()
.
Where
(
...
...
backend/internal/service/auth_service.go
View file @
82259d13
...
...
@@ -1500,6 +1500,9 @@ func resolvedTokenVersion(user *User) int64 {
if
user
==
nil
{
return
0
}
if
user
.
TokenVersionResolved
{
return
user
.
TokenVersion
}
material
:=
strings
.
ToLower
(
strings
.
TrimSpace
(
user
.
Email
))
+
"
\n
"
+
user
.
PasswordHash
sum
:=
sha256
.
Sum256
([]
byte
(
material
))
...
...
backend/internal/service/user.go
View file @
82259d13
...
...
@@ -23,12 +23,15 @@ type User struct {
Status
string
AllowedGroups
[]
int64
TokenVersion
int64
// Incremented on password change to invalidate existing tokens
SignupSource
string
LastLoginAt
*
time
.
Time
LastActiveAt
*
time
.
Time
LastUsedAt
*
time
.
Time
CreatedAt
time
.
Time
UpdatedAt
time
.
Time
// TokenVersionResolved indicates TokenVersion already contains the fingerprint-derived
// value expected in JWT claims and refresh-token state.
TokenVersionResolved
bool
SignupSource
string
LastLoginAt
*
time
.
Time
LastActiveAt
*
time
.
Time
LastUsedAt
*
time
.
Time
CreatedAt
time
.
Time
UpdatedAt
time
.
Time
// GroupRates 用户专属分组倍率配置
// map[groupID]rateMultiplier
...
...
backend/internal/service/user_service.go
View file @
82259d13
...
...
@@ -943,10 +943,11 @@ func (s *UserService) GetByID(ctx context.Context, id int64) (*User, error) {
}
func
normalizeLoadedUserTokenVersion
(
user
*
User
)
{
if
user
==
nil
{
if
user
==
nil
||
user
.
TokenVersionResolved
{
return
}
user
.
TokenVersion
=
resolvedTokenVersion
(
user
)
user
.
TokenVersionResolved
=
true
}
// TouchLastActive 通过防抖更新 users.last_active_at,减少鉴权热路径写放大。
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment