deno.land / x / oauth4webapi@v1.2.2 / examples / device_authorization_grant.ts

device_authorization_grant.ts
View Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import * as oauth from '../src/index.js'
const issuer = new URL('https://example.as.com')const as = await oauth .discoveryRequest(issuer) .then((response) => oauth.processDiscoveryResponse(issuer, response))
const client: oauth.Client = { client_id: 'abc4ba37-4ab8-49b5-99d4-9441ba35d428', token_endpoint_auth_method: 'none',}
let device_code: stringlet interval: numberlet verification_uri: stringlet user_code: stringlet verification_uri_complete: string | undefined
{ const parameters = new URLSearchParams() parameters.set('scope', 'openid email')
const response = await oauth.deviceAuthorizationRequest(as, client, parameters) let challenges: oauth.WWWAuthenticateChallenge[] | undefined if ((challenges = oauth.parseWwwAuthenticateChallenges(response))) { for (const challenge of challenges) { console.log('challenge', challenge) } throw new Error() // Handle www-authenticate challenges as needed }
const result = await oauth.processDeviceAuthorizationResponse(as, client, response) if (oauth.isOAuth2Error(result)) { console.log('error', result) throw new Error() // Handle OAuth 2.0 response body error }
;({ device_code, verification_uri, verification_uri_complete, user_code, interval = 5 } = result)}
// user gets shown the verification_uri and user_code, or scans a qr code formed from verification_uri_complete as input// user starts authenticating on his other deviceconsole.log({ verification_uri, verification_uri_complete, user_code })
function wait() { return new Promise((resolve) => { setTimeout(resolve, interval * 1000) })}
let success: oauth.TokenEndpointResponse | undefined = undefined
while (success === undefined) { await wait() const response = await oauth.deviceCodeGrantRequest(as, client, device_code) let challenges: oauth.WWWAuthenticateChallenge[] | undefined if ((challenges = oauth.parseWwwAuthenticateChallenges(response))) { for (const challenge of challenges) { console.log('challenge', challenge) } throw new Error() // Handle www-authenticate challenges as needed }
const result = await oauth.processDeviceCodeResponse(as, client, response) if (oauth.isOAuth2Error(result)) { console.log('error', result) throw new Error() // Handle OAuth 2.0 response body error }
if (oauth.isOAuth2Error(result)) { // response is oauth style error object switch (result.error) { case 'slow_down': interval += 5 case 'authorization_pending': continue default: console.log('error', result) throw new Error() // Handle OAuth 2.0 response body error } } else { success = result }}
console.log('result', success)
if (success.id_token) { console.log('ID Token Claims', oauth.getValidatedIdTokenClaims(success))}
oauth4webapi

Version Info

Tagged at
2 years ago