Skip to content

Commit 6205478

Browse files
committed
Only generate the auth URL and start the login flow on click
1 parent 50129e8 commit 6205478

File tree

3 files changed

+23
-16
lines changed

3 files changed

+23
-16
lines changed

src/domain/login/LoginViewModel.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ export class LoginViewModel extends ViewModel {
116116
this._startOIDCLoginViewModel = this.track(
117117
new StartOIDCLoginViewModel(this.childOptions({loginOptions: this._loginOptions}))
118118
);
119-
await this._startOIDCLoginViewModel.start();
120119
this.emitChange("startOIDCLoginViewModel");
120+
this._startOIDCLoginViewModel.discover();
121121
}
122122

123123
_showError(message) {
@@ -129,6 +129,7 @@ export class LoginViewModel extends ViewModel {
129129
this._isBusy = status;
130130
this._passwordLoginViewModel?.setBusy(status);
131131
this._startSSOLoginViewModel?.setBusy(status);
132+
this.startOIDCLoginViewModel?.setBusy(status);
132133
this.emitChange("isBusy");
133134
}
134135

@@ -246,7 +247,7 @@ export class LoginViewModel extends ViewModel {
246247
if (this._loginOptions) {
247248
if (this._loginOptions.sso) { this._showSSOLogin(); }
248249
if (this._loginOptions.password) { this._showPasswordLogin(); }
249-
if (this._loginOptions.oidc) { await this._showOIDCLogin(); }
250+
if (this._loginOptions.oidc) { this._showOIDCLogin(); }
250251
if (!this._loginOptions.sso && !this._loginOptions.password && !this._loginOptions.oidc) {
251252
this._showError("This homeserver supports neither SSO nor password based login flows");
252253
}

src/domain/login/StartOIDCLoginViewModel.js

+17-13
Original file line numberDiff line numberDiff line change
@@ -21,35 +21,39 @@ export class StartOIDCLoginViewModel extends ViewModel {
2121
constructor(options) {
2222
super(options);
2323
this._isBusy = true;
24-
this._authorizationEndpoint = null;
24+
this._issuer = options.loginOptions.oidc.issuer;
25+
this._homeserver = options.loginOptions.homeserver;
2526
this._api = new OidcApi({
2627
clientId: "hydrogen-web",
27-
issuer: options.loginOptions.oidc.issuer,
28+
issuer: this._issuer,
2829
request: this.platform.request,
2930
encoding: this.platform.encoding,
3031
});
31-
this._homeserver = options.loginOptions.homeserver;
3232
}
3333

3434
get isBusy() { return this._isBusy; }
35-
get authorizationEndpoint() { return this._authorizationEndpoint; }
3635

37-
async start() {
36+
setBusy(status) {
37+
this._isBusy = status;
38+
this.emitChange("isBusy");
39+
}
40+
41+
async discover() {
42+
// Ask for the metadata once so it gets discovered and cached
43+
await this._api.metadata()
44+
}
45+
46+
async startOIDCLogin() {
3847
const p = this._api.generateParams("openid");
3948
await Promise.all([
4049
this.platform.settingsStorage.setInt(`oidc_${p.state}_started_at`, Date.now()),
4150
this.platform.settingsStorage.setString(`oidc_${p.state}_nonce`, p.nonce),
4251
this.platform.settingsStorage.setString(`oidc_${p.state}_code_verifier`, p.codeVerifier),
4352
this.platform.settingsStorage.setString(`oidc_${p.state}_homeserver`, this._homeserver),
44-
this.platform.settingsStorage.setString(`oidc_${p.state}_issuer`, this._api.issuer),
53+
this.platform.settingsStorage.setString(`oidc_${p.state}_issuer`, this._issuer),
4554
]);
4655

47-
this._authorizationEndpoint = await this._api.authorizationEndpoint(p);
48-
this._isBusy = false;
49-
}
50-
51-
setBusy(status) {
52-
this._isBusy = status;
53-
this.emitChange("isBusy");
56+
const link = await this._api.authorizationEndpoint(p);
57+
this.platform.openUrl(link);
5458
}
5559
}

src/platform/web/ui/login/LoginView.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ class StartOIDCLoginView extends TemplateView {
8383
return t.div({ className: "StartOIDCLoginView" },
8484
t.a({
8585
className: "StartOIDCLoginView_button button-action secondary",
86-
href: vm => (vm.isBusy ? "#" : vm.authorizationEndpoint),
86+
type: "button",
87+
onClick: () => vm.startOIDCLogin(),
88+
disabled: vm => vm.isBusy
8789
}, vm.i18n`Log in via OIDC`)
8890
);
8991
}

0 commit comments

Comments
 (0)