feat: support verification_url workaround for DeviceAuthorizationResponse unmarshal (#577)
This commit is contained in:
parent
33485b82ba
commit
e75a061807
2 changed files with 52 additions and 0 deletions
|
@ -1,5 +1,7 @@
|
||||||
package oidc
|
package oidc
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
// DeviceAuthorizationRequest implements
|
// DeviceAuthorizationRequest implements
|
||||||
// https://www.rfc-editor.org/rfc/rfc8628#section-3.1,
|
// https://www.rfc-editor.org/rfc/rfc8628#section-3.1,
|
||||||
// 3.1 Device Authorization Request.
|
// 3.1 Device Authorization Request.
|
||||||
|
@ -20,6 +22,26 @@ type DeviceAuthorizationResponse struct {
|
||||||
Interval int `json:"interval,omitempty"`
|
Interval int `json:"interval,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (resp *DeviceAuthorizationResponse) UnmarshalJSON(data []byte) error {
|
||||||
|
type Alias DeviceAuthorizationResponse
|
||||||
|
aux := &struct {
|
||||||
|
// workaround misspelling of verification_uri
|
||||||
|
// https://stackoverflow.com/q/76696956/5690223
|
||||||
|
// https://developers.google.com/identity/protocols/oauth2/limited-input-device?hl=fr#success-response
|
||||||
|
VerificationURL string `json:"verification_url"`
|
||||||
|
*Alias
|
||||||
|
}{
|
||||||
|
Alias: (*Alias)(resp),
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(data, &aux); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if resp.VerificationURI == "" {
|
||||||
|
resp.VerificationURI = aux.VerificationURL
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// DeviceAccessTokenRequest implements
|
// DeviceAccessTokenRequest implements
|
||||||
// https://www.rfc-editor.org/rfc/rfc8628#section-3.4,
|
// https://www.rfc-editor.org/rfc/rfc8628#section-3.4,
|
||||||
// Device Access Token Request.
|
// Device Access Token Request.
|
||||||
|
|
30
pkg/oidc/device_authorization_test.go
Normal file
30
pkg/oidc/device_authorization_test.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package oidc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDeviceAuthorizationResponse_UnmarshalJSON(t *testing.T) {
|
||||||
|
jsonStr := `{
|
||||||
|
"device_code": "deviceCode",
|
||||||
|
"user_code": "userCode",
|
||||||
|
"verification_url": "http://example.com/verify",
|
||||||
|
"expires_in": 3600,
|
||||||
|
"interval": 5
|
||||||
|
}`
|
||||||
|
|
||||||
|
expected := &DeviceAuthorizationResponse{
|
||||||
|
DeviceCode: "deviceCode",
|
||||||
|
UserCode: "userCode",
|
||||||
|
VerificationURI: "http://example.com/verify",
|
||||||
|
ExpiresIn: 3600,
|
||||||
|
Interval: 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp DeviceAuthorizationResponse
|
||||||
|
err := resp.UnmarshalJSON([]byte(jsonStr))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expected, &resp)
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue