Skip to content

Commit

Permalink
Handle verification_url field in device flow (#846)
Browse files Browse the repository at this point in the history
  • Loading branch information
int128 authored Dec 24, 2022
1 parent 345465a commit adfbc48
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
11 changes: 8 additions & 3 deletions pkg/usecases/authentication/devicecode/devicecode.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,19 @@ func (u *DeviceCode) Do(ctx context.Context, in *Option, oidcClient client.Inter

authResponse, err := oidcClient.GetDeviceAuthorization(ctx)
if err != nil {
return nil, err
return nil, fmt.Errorf("authorization error: %w", err)
}

if authResponse.VerificationURIComplete == "" {
if authResponse.VerificationURIComplete != "" {
u.openURL(ctx, in, authResponse.VerificationURIComplete)
} else if authResponse.VerificationURI != "" {
u.Logger.Printf("Please enter the following code when asked in your browser: %s", authResponse.UserCode)
u.openURL(ctx, in, authResponse.VerificationURI)
} else if authResponse.VerificationURL != "" {
u.Logger.Printf("Please enter the following code when asked in your browser: %s", authResponse.UserCode)
u.openURL(ctx, in, authResponse.VerificationURL)
} else {
u.openURL(ctx, in, authResponse.VerificationURIComplete)
return nil, fmt.Errorf("no verification URI in the authorization response")
}

tokenSet, err := oidcClient.ExchangeDeviceCode(ctx, authResponse)
Expand Down
27 changes: 27 additions & 0 deletions pkg/usecases/authentication/devicecode/devicecode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,33 @@ func TestDeviceCode(t *testing.T) {
}
})

t.Run("Server returns verification_url", func(t *testing.T) {
mockBrowser := browser.NewMockInterface(t)
mockClient := client.NewMockInterface(t)
dc := &DeviceCode{
Browser: mockBrowser,
Logger: logger.New(t),
}
mockResponse := &oauth2dev.AuthorizationResponse{
DeviceCode: "device-code-1",
VerificationURL: "https://example.com/verificationCompleteURL",
ExpiresIn: 2,
Interval: 1,
}
mockClient.EXPECT().GetDeviceAuthorization(ctx).Return(mockResponse, nil).Once()
mockBrowser.EXPECT().Open("https://example.com/verificationCompleteURL").Return(nil).Once()
mockClient.EXPECT().ExchangeDeviceCode(mock.Anything, mockResponse).Return(&oidc.TokenSet{
IDToken: "test-id-token",
}, nil).Once()
ts, err := dc.Do(ctx, &Option{}, mockClient)
if err != nil {
t.Errorf("returned unexpected error: %v", err)
}
if ts.IDToken != "test-id-token" {
t.Errorf("wrong returned tokenset: %v", err)
}
})

t.Run("Error when exchanging the device code", func(t *testing.T) {
mockBrowser := browser.NewMockInterface(t)
mockClient := client.NewMockInterface(t)
Expand Down

0 comments on commit adfbc48

Please sign in to comment.