Skip to content

Commit 137ee37

Browse files
Support opaque tokens when connection updates token
1 parent 29b0065 commit 137ee37

File tree

1 file changed

+38
-22
lines changed

1 file changed

+38
-22
lines changed

deps/rabbitmq_auth_backend_oauth2/src/rabbit_auth_backend_oauth2.erl

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,29 +110,45 @@ check_topic_access(#auth_user{impl = DecodedTokenFun},
110110
end).
111111

112112
update_state(AuthUser, NewToken) ->
113-
case resolve_resource_server(NewToken) of
114-
{error, _} = Err0 -> Err0;
115-
{ResourceServer, _} = Tuple ->
116-
case check_token(NewToken, Tuple) of
117-
%% avoid logging the token
118-
{refused, {error, {invalid_token, error, _Err, _Stacktrace}}} ->
119-
{refused, "Authentication using an OAuth 2/JWT token failed: provided token is invalid"};
120-
{refused, Err} ->
121-
{refused, rabbit_misc:format("Authentication using an OAuth 2/JWT token failed: ~tp", [Err])};
122-
{ok, DecodedToken} ->
123-
CurToken = AuthUser#auth_user.impl,
124-
case ensure_same_username(
125-
ResourceServer#resource_server.preferred_username_claims,
126-
CurToken(), DecodedToken) of
127-
ok ->
128-
Tags = tags_from(DecodedToken),
129-
{ok, AuthUser#auth_user{tags = Tags,
130-
impl = fun() -> DecodedToken end}};
131-
{error, mismatch_username_after_token_refresh} ->
132-
{refused,
133-
"Not allowed to change username on refreshed token"}
134-
end
113+
TokenResult = case oauth2_client:is_jwt_token(NewToken) of
114+
true -> {ok, NewToken};
115+
false ->
116+
case oauth2_client:introspect_token(NewToken) of
117+
{ok, Tk1} ->
118+
?LOG_DEBUG("Successfully introspected token : ~p", [Tk1]),
119+
{ok, Tk1};
120+
{error, Err1} ->
121+
?LOG_ERROR("Failed to introspected token due to ~p", [Err1]),
122+
{error, Err1}
135123
end
124+
end,
125+
case TokenResult of
126+
{ok, Token} ->
127+
case resolve_resource_server(Token) of
128+
{error, _} = Err0 -> Err0;
129+
{ResourceServer, _} = Tuple ->
130+
case check_token(Token, Tuple) of
131+
%% avoid logging the token
132+
{refused, {error, {invalid_token, error, _Err, _Stacktrace}}} ->
133+
{refused, "Authentication using an OAuth 2/JWT token failed: provided token is invalid"};
134+
{refused, Err} ->
135+
{refused, rabbit_misc:format("Authentication using an OAuth 2/JWT token failed: ~tp", [Err])};
136+
{ok, DecodedToken} ->
137+
CurToken = AuthUser#auth_user.impl,
138+
case ensure_same_username(
139+
ResourceServer#resource_server.preferred_username_claims,
140+
CurToken(), DecodedToken) of
141+
ok ->
142+
Tags = tags_from(DecodedToken),
143+
{ok, AuthUser#auth_user{tags = Tags,
144+
impl = fun() -> DecodedToken end}};
145+
{error, mismatch_username_after_token_refresh} ->
146+
{refused,
147+
"Not allowed to change username on refreshed token"}
148+
end
149+
end
150+
end;
151+
{error, Error} -> {refused, "Unable to introspect token: ~p", [Error]}
136152
end.
137153

138154
expiry_timestamp(#auth_user{impl = DecodedTokenFun}) ->

0 commit comments

Comments
 (0)