Commit Graph

123 Commits

Author SHA1 Message Date
Tyler James Leonhardt
6bd8e90fb7 Misc fixes for Sovereign Clouds (#228591)
* Misc fixes for Sovereign Clouds

* For now, use the URL handler since the main flow doesn't work right now because the localhost redirect url needs to be in those environments
* Includes the name of the cloud in the PCAs so that we have separation between the auth providers
* extra logging for the URL Handler

* fix tests
2024-09-13 21:57:12 +02:00
Tyler James Leonhardt
db2a1df708 Use an EventBufferer to ensure only one event across PCAs (#228400) 2024-09-13 01:24:41 +02:00
Tyler James Leonhardt
b8be82f239 Workaround MSAL behavior (#228289)
* Workaround MSAL behavior

The main change this makes is around what scopes are being requested.

Due to an MSAL or Identity issue, if you request a resource like `FOO/user_impersonation` and then `email`... the 2nd call does not use Graph and instead uses FOO and FOO may not have an `email` scope available. To work around this, if we detect that all scopes being requested are [OIDC scopes](https://learn.microsoft.com/en-us/entra/identity-platform/scopes-oidc#openid-connect-scopes) then we tack on `User.Read` to make sure that what gets returned is in fact from Graph. This prevents an infinite loop that was happening before. MSAL/Identity should fix this behavior, but this works for now.

Additionally, MSAL does already tack on OIDC scopes to all requests so I removed the logic that adds those.

Couple small things:
* Make sure MSAL logs get logged (trace)
* Use a Sequencer to make sure acquireToken calls are done sequentially just in case.

* more comment
2024-09-12 02:29:29 +02:00
Tyler James Leonhardt
533d8ec6a5 Rework eventing for PCAs and fix a few bugs along the way (#227854)
A big change, but a good one... This addresses some core issues around how we manage multiple PublicClientApplications (which are an object that should be created for each set of clientId,authority). Previously, we were doing some pretty nasty things to detect when a new PCA was created/deleted and as a result it would cause infinite loops and the likes...

Now we've focused on managing that in SecretStorage by looking for a `publicClientApplications` key. This is all encapsulated in the new `PublicClientApplicationsSecretStorage`.

Since we no longer relied on that hack, we still needed some way to have a PCA inform that:
* accounts have changed
* the last account was removed (signaling that this PCA could be disposed of in `PublicClientApplicationsSecretStorage`)

Both of these events have been added to `CachedPublicClientApplication` (now in its own file) and are being used. (replacing the old `_accountChangeHandler` which was hacky... true events are cleaner).

Last thing in the eventing space is that I try to minimize calls to `_storePublicClientApplications` so to not spam events across SecretStorage. You can see this in my usage of `_doCreatePublicClientApplication` over `getOrCreate`.

Couple random other things:
* `changed` accounts are properly bubbled up in `_onDidChangeSessionsEmitter` which is needed when a token is refreshed
* `getSessions` when no scopes are passed in no longer causes new tokens to be minted
* we use to only remove the first account we found but in some cases there may be the same account across different PCAs, so there's a `return` that's removed in `authProvider.ts` that fixes this bug
* Logging is clearer and more verbose (in a good way)
2024-09-06 21:03:25 -07:00
Tyler James Leonhardt
214bf83a48 3 Changes to MSAL auth (#226580)
* Remove access token refreshing logic. The new calling pattern for an extension is that they should just always call `getSession` before doing something with it. The session that returns will be valid because MSAL will refresh any access tokens that are close to expiry using the refresh tokens that it has
  * NOTE: access tokens expire after 1hr. Refresh tokens expire after like... many days.
* Have `createSession` fire an `onDidChangeSession` event so that the badge goes away
* Improved logging messages
2024-08-26 08:27:20 +02:00
Tyler James Leonhardt
6544b003dc Bump msal-node and fix a bad contrast ratio (#226210)
Bumps MSAL-node which contains [my fix](https://github.com/AzureAD/microsoft-authentication-library-for-js/pull/7247) that will actually show our error template.

Also fixes an A11y contrast issue with said error template.
2024-08-22 00:53:21 +02:00
Tyler James Leonhardt
e1db90f81d Add logging for deciding on MSAL (#226112)
so it's clear why
2024-08-20 18:28:02 -07:00
Tyler James Leonhardt
c125b90d41 Add experimentation to Microsoft auth (#226107)
* Add experimentation to Microsoft auth

So that we can gradually roll out MSAL support.

* correct order
2024-08-20 17:17:15 -07:00
Tyler James Leonhardt
b2d6860308 Improve refresh and scope handling (#225832)
* Moves the `setupRefresh` stuff into the CachedPublicClientApp simplifying things a bit
* Uses a ScopeData class to handle all scope operations fixing an issue where we were passing in the wrong array into the `acquireTokenInteractive`
2024-08-17 07:55:33 +02:00
Tyler James Leonhardt
9d49135f49 LoopbackClientAndOpener Tests (#225458)
(first tests in this extension!)
2024-08-12 18:42:44 -07:00
Tyler James Leonhardt
44464d7ccd Fix reload modal logic when turning on/off MSAL (#225446)
This wasn't firing before. This fixes that.
2024-08-13 00:24:18 +02:00
Tyler James Leonhardt
a8b2cef91c Adopt error template and some minor tweaks to error rendering (#225426)
NOTE: For this to get lit up, this PR needs to go in in MSAL-node: https://github.com/AzureAD/microsoft-authentication-library-for-js/pull/7247
2024-08-12 20:05:04 +02:00
Tyler James Leonhardt
70d27743ac Ability to use MSAL in the Desktop (#225272)
* Ability to use MSAL in the Desktop

* add comment about MSAL workaround
2024-08-09 12:18:34 -07:00
Tyler James Leonhardt
86495e947b Use global fetch and crypto (#221736)
Now that we're on Node 20, we can just use the global fetch and crypto which work the same in node and in the browser.
2024-07-15 10:58:31 -07:00
Tyler James Leonhardt
649bcae6d3 Plumb error through to auth page (#221511)
plumb error through to auth page
2024-07-11 14:50:49 -07:00
Tyler James Leonhardt
5d7157cb03 Implement getAccounts API over getSessions (#215874)
And plumb that through to the Microsoft auth provider
2024-06-16 18:12:37 -07:00
Tyler James Leonhardt
1357fca0f7 Add cancellable promise to Microsoft auth flows (#211495)
Fixes #211406
2024-04-27 01:06:58 +02:00
Tyler James Leonhardt
1501e97f52 preferred_username should be... preferred (#199445)
Apparently it's possible for preferred_username to be like `foo@mybiz.com` while `email` is set to `foo@mybizemail.com`... This is the more correct ordering.
2023-11-28 12:45:50 -08:00
Tyler James Leonhardt
d5c2817e69 Use email for label & use label to group results in Account menu (#193727)
So, when you make a new session in the Microsoft Identity stack, depending on the scopes you pass in you might get:
* A token with a name & email
* A token with just a name
Additionally, Microsoft has like 3-4 concepts of essentially an "id" but depending on what you're trying to access, you might get a different value.

This historical behavior leads to 2 awkward things:
1. The account menu shows two accounts, one with name & email, one with just email.
2. The account menu shows two of the same accounts, but their underlying id is different

So, to fix this, we're just gonna lean on the labels. In other words, if there are two accounts that share the same label, then they will be grouped together.

The previous behavior was hurting the Azure Account folks and the Q# folks and with this change, I believe they both should be happy.

Interestingly enough, when I inherited this code, it use to do this, but I changed it to use the id as that seemed "more correct"... so it a way, this is reverting a change I did a while back.

Fixes https://github.com/microsoft/vscode/issues/184218
2023-09-21 14:09:25 -07:00
Matt Bierner
2c52e4ca35 Alias Thenable to PromiseLike (#192456)
Fixes #192385

This fixes some typing issues with `Thenable` that were hiding potential bugs
2023-09-13 10:50:40 -07:00
Tyler James Leonhardt
379d31d162 Invoke session change emitter when session is created in getSession (#192828)
fixes https://github.com/microsoft/vscode/issues/192806
2023-09-12 09:13:33 -07:00
Tyler James Leonhardt
41e940f76f Use SequencerByKey to sequence operations of the same set of scopes (#192638)
The idea here is... if a token is currently being refreshed, well then getting a token of those scopes should wait for that to finish.

Core has a really nice `SequencerByKey` for exactly this kind of thing, and so I've stolen that and started to organize the code with a `common` folder.

Oh, I also noticed we were sorting twice and fixed that to only sort once.

ref https://github.com/microsoft/vscode/issues/186693
2023-09-09 07:09:20 +02:00
Tyler James Leonhardt
52f27e2e2f Log a lot more of the Microsoft Auth extension (#192629)
This PR adds a ton more logging, a consistant format, and fixes the log levels of some.

Additionally, there are two small fixes that I have included:
* we were firing the `_sessionChangeEmitter` twice when a session was removed
* when processing updates from other windows, we returned instead of continued... thus were only processing the first account that was added in another window
2023-09-08 23:25:25 +02:00
Tyler James Leonhardt
9fbd538cb3 Revert back to 2/3rds (#192502)
It was higher for debugging purposes.
2023-09-08 02:23:16 +02:00
Tyler James Leonhardt
53d03d0742 Implement a "pending store" and only actually store the last one (#192488)
ref https://github.com/microsoft/vscode/issues/186693
2023-09-07 14:32:15 -07:00
Tyler James Leonhardt
cb38b1b567 Fire event when using non-localserver flow (#189493)
Fixes https://github.com/microsoft/vscode/issues/186558
2023-08-02 11:26:09 -07:00
Tyler James Leonhardt
dd2441f7ba Polish Sovereign Cloud support (#184634)
* Use `@azure/ms-rest-azure-env` as official reference of endpoints
* Allow better configuration of custom clouds (these are new so it is ok to change the settings without migration)

Also clean up:

* querystring -> URLSearchParams (getting rid of a package dependency in the web)
* handle `workbench.getCodeExchangeProxyEndpoints` in one place
2023-06-08 12:39:29 -07:00
Benjamin Pasero
3a69e153f6 quick access - allow a Promise<FastAndSlowPicks<T>> and adopt for commands (#180664)
* quick access - allow a `Promise<FastAndSlowPicks<T>>` and adopt for commands

* fix telemetry
2023-04-24 06:41:25 +02:00
Tyler James Leonhardt
bede6ba243 Instrument Microsoft account type (#180573)
So we can see if folks are using MSA or AAD accounts. Also, this cleans up some dead code.

Fixes https://github.com/microsoft/vscode-internalbacklog/issues/3903
2023-04-21 14:23:34 -07:00
Tyler James Leonhardt
3a02bc9de1 Updates from the rename (#179901)
* Updates from the rename

Azure Cloud -> Microsoft Sovereign Cloud

* remove azure once more
2023-04-13 13:01:13 -07:00
Tyler James Leonhardt
b0d7acec38 Logger per auth provider (#179896)
So that we can have an output channel for each.
2023-04-13 19:26:36 +01:00
Brandon Waterloo [MSFT]
f9d14d68fb Support sovereign/custom clouds in microsoft authentication provider (#178725) 2023-04-07 16:38:38 -07:00
Tyler James Leonhardt
71f619cbda Ensure the original scopes requested are the scopes in the Session returned (#174645)
Fixes #174631
Fixes #167791
2023-02-17 03:34:39 +01:00
Tyler James Leonhardt
7fc1f6aacb use better mechanism for base64 decoding with unicode characters (#172445)
Fixes #172441
2023-01-25 21:32:00 +01:00
Tyler James Leonhardt
dcb358a79f Remove console.log (#171563)
This was for debugging. If it was legit I would have used the logger that's available.
2023-01-18 12:13:23 +11:00
Matt Bierner
c390a331c5 Switch to standard imports (#169451) 2022-12-17 00:22:53 +01:00
Tyler James Leonhardt
461b3f6184 Only have a single window store the session (#169356)
Before this change, every single window was writing to the same secret at basically the same time because they would all refresh the token and then attempt to store that refresh token.

I believe this was causing a few race condition bugs that users were seeing.

With this change we now so our best to have only 1 window store the session by relying on the window focused state.

If the window is focused or becomes focused, we will store the refresh token.

If the window detects that another window has stored something, we will not attempt to wait for focus to store something.

If nothing has happened, and it's been 5 hrs (+/- some seconds) go ahead and store it. This is the scenario of when a user has VS Code in the background for like ages but never goes to it.

ref #165115
ref #130893
ref #168485
2022-12-16 06:58:32 +01:00
Tyler James Leonhardt
ef415578d1 Take advantage of platform features in Microsoft Authentication extension (#166066) 2022-11-10 18:26:48 -08:00
Logan Ramos
bf1697d98c Consume proposed telemetry API (#165862)
* Consume proposed telemetry API

* Update webpack
2022-11-08 21:58:28 -05:00
Tyler James Leonhardt
6684350a58 Onboard GitHub & Microsoft auth extensions to l10n (#163662)
* onboard github-auth completely to l10n

* onboard microsoft-authentication entirely on to l10n
2022-10-14 08:41:21 -07:00
Sandeep Somavarapu
35c7ee9d02 Support log output channels for extensions (#161249)
* introduce log api in extension context

* separate registering output vs log channel

* Separate extension log channels in show logs command

* add logging error to embedder logger

* show extension log in the extension editor

* configure log level per extension

* change the order of log entries

* introduce logger

* align with output chanel

* revert changes

* fixes
2022-09-19 09:03:41 -07:00
Tyler James Leonhardt
dc9336c303 make sure we add offline_access when creating sessions (#159116) 2022-08-25 08:48:01 -04:00
ChaseKnowlden
19d0675506 Add offline_access to list of default scopes (#157453)
Add a new scope to default scopes
2022-08-08 14:55:13 -07:00
Tyler James Leonhardt
d859b334cb We only need to wait on the input box for un-supported environments (#157157)
we only need to wait on the input box for un-supported environments
2022-08-04 23:55:51 +02:00
Tyler James Leonhardt
4017fd126f Show quick pick when redirect fails to complete redirect to be more robust (#156515)
* show quick pick when redirect fails to complete redirect to be more robust

* matt feedback
2022-07-28 10:26:18 -07:00
Johannes
0656d21d11 auto-fixed prefer-const violation 2022-06-08 17:49:21 +02:00
Tyler James Leonhardt
847629239b add owner and comment to some telemetry events (#148752) 2022-05-05 17:30:51 -04:00
Tyler Leonhardt
9c15f4185a add favicon and nonce enforcement in microsoft auth 2022-04-15 15:47:20 -07:00
Tyler Leonhardt
52a394bdea Introduce removeSessionByIToken to remove sessions that aren't in this._tokens yet. Fixes #145189 2022-04-14 15:21:54 -07:00
Tyler Leonhardt
5919378269 don't surface error on gets and remove microsoft secret migration. Fixes #146553 2022-04-14 12:18:33 -07:00