4
4
*--------------------------------------------------------------------------------------------*/
5
5
6
6
import * as crypto from 'crypto' ;
7
- import * as vscode from 'vscode' ;
8
7
import * as https from 'https' ;
9
8
import * as querystring from 'querystring' ;
10
- import { keychain } from './keychain' ;
11
- import { toBase64UrlEncoding } from './utils' ;
9
+ import * as vscode from 'vscode' ;
12
10
import { createServer , startServer } from './authServer' ;
11
+ import { keychain } from './keychain' ;
13
12
import Logger from './logger' ;
13
+ import { toBase64UrlEncoding } from './utils' ;
14
14
15
15
const redirectUrl = 'https://vscode-redirect.azurewebsites.net/' ;
16
16
const loginEndpointUrl = 'https://login.microsoftonline.com/' ;
17
17
const clientId = 'aebc6443-996d-45c2-90f0-388ff96faa56' ;
18
- const scope = 'https://management.core.windows.net/.default offline_access ' ;
18
+ const resourceId = 'https://management.core.windows.net/' ;
19
19
const tenant = 'common' ;
20
20
21
21
interface IToken {
@@ -24,6 +24,13 @@ interface IToken {
24
24
refreshToken : string ;
25
25
}
26
26
27
+ interface ITokenClaims {
28
+ email ?: string ;
29
+ unique_name ?: string ;
30
+ oid ?: string ;
31
+ altsecid ?: string ;
32
+ }
33
+
27
34
export const onDidChangeSessions = new vscode . EventEmitter < void > ( ) ;
28
35
29
36
export class AzureActiveDirectoryService {
@@ -59,23 +66,20 @@ export class AzureActiveDirectoryService {
59
66
}
60
67
61
68
private tokenToAccount ( token : IToken ) : vscode . Session {
69
+ const claims = this . getTokenClaims ( token . accessToken ) ;
62
70
return {
63
- id : '' ,
71
+ id : claims ?. oid || claims ?. altsecid || '' ,
64
72
accessToken : token . accessToken ,
65
- displayName : this . getDisplayNameFromToken ( token . accessToken )
73
+ displayName :
claims ?. email || claims ?. unique_name || '[email protected] '
66
74
} ;
67
75
}
68
76
69
- private getDisplayNameFromToken ( accessToken : string ) : string {
70
- let displayName = '[email protected] ' ;
77
+ private getTokenClaims ( accessToken : string ) : ITokenClaims | undefined {
71
78
try {
72
- // TODO fixme
73
- displayName = JSON . parse ( atob ( accessToken . split ( '.' ) [ 1 ] ) ) ;
79
+ return JSON . parse ( Buffer . from ( accessToken . split ( '.' ) [ 1 ] , 'base64' ) . toString ( ) ) ;
74
80
} catch ( e ) {
75
- // Fall back to example display name
81
+ Logger . error ( e . message ) ;
76
82
}
77
-
78
- return displayName ;
79
83
}
80
84
81
85
get sessions ( ) : vscode . Session [ ] {
@@ -108,7 +112,7 @@ export class AzureActiveDirectoryService {
108
112
109
113
const codeVerifier = toBase64UrlEncoding ( crypto . randomBytes ( 32 ) . toString ( 'base64' ) ) ;
110
114
const codeChallenge = toBase64UrlEncoding ( crypto . createHash ( 'sha256' ) . update ( codeVerifier ) . digest ( 'base64' ) ) ;
111
- const loginUrl = `${ loginEndpointUrl } ${ tenant } /oauth2/v2.0/ authorize?response_type=code&response_mode=query&client_id=${ encodeURIComponent ( clientId ) } &redirect_uri=${ encodeURIComponent ( redirectUrl ) } &state=${ state } &scope =${ encodeURIComponent ( scope ) } &prompt=select_account&code_challenge_method=S256&code_challenge=${ codeChallenge } ` ;
115
+ const loginUrl = `${ loginEndpointUrl } ${ tenant } /oauth2/authorize?response_type=code&response_mode=query&client_id=${ encodeURIComponent ( clientId ) } &redirect_uri=${ encodeURIComponent ( redirectUrl ) } &state=${ state } &resource =${ encodeURIComponent ( resourceId ) } &prompt=select_account&code_challenge_method=S256&code_challenge=${ codeChallenge } ` ;
112
116
113
117
await redirectReq . res . writeHead ( 302 , { Location : loginUrl } ) ;
114
118
redirectReq . res . end ( ) ;
@@ -165,12 +169,12 @@ export class AzureActiveDirectoryService {
165
169
grant_type : 'authorization_code' ,
166
170
code : code ,
167
171
client_id : clientId ,
168
- scope : scope ,
172
+ resource : resourceId ,
169
173
code_verifier : codeVerifier ,
170
174
redirect_uri : redirectUrl
171
175
} ) ;
172
176
173
- const tokenUrl = vscode . Uri . parse ( `${ loginEndpointUrl } ${ tenant } /oauth2/v2.0/ token` ) ;
177
+ const tokenUrl = vscode . Uri . parse ( `${ loginEndpointUrl } ${ tenant } /oauth2/token` ) ;
174
178
175
179
const post = https . request ( {
176
180
host : tokenUrl . authority ,
@@ -220,12 +224,12 @@ export class AzureActiveDirectoryService {
220
224
refresh_token : refreshToken ,
221
225
client_id : clientId ,
222
226
grant_type : 'refresh_token' ,
223
- scope : scope
227
+ resource : resourceId
224
228
} ) ;
225
229
226
230
const post = https . request ( {
227
231
host : 'login.microsoftonline.com' ,
228
- path : `/${ tenant } /oauth2/v2.0/ token` ,
232
+ path : `/${ tenant } /oauth2/token` ,
229
233
method : 'POST' ,
230
234
headers : {
231
235
'Content-Type' : 'application/x-www-form-urlencoded' ,
0 commit comments