NewDeviceRequest parses an http Request returns a Device request
(ctx context.Context, r *http.Request)
| 18 | |
| 19 | // NewDeviceRequest parses an http Request returns a Device request |
| 20 | func (f *Fosite) NewDeviceRequest(ctx context.Context, r *http.Request) (_ DeviceRequester, err error) { |
| 21 | ctx, span := trace.SpanFromContext(ctx).TracerProvider().Tracer("github.com/ory/hydra/v2/fosite").Start(ctx, "Fosite.NewDeviceRequest") |
| 22 | defer otelx.End(span, &err) |
| 23 | |
| 24 | request := NewDeviceRequest() |
| 25 | request.Lang = i18n.GetLangFromRequest(f.Config.GetMessageCatalog(ctx), r) |
| 26 | |
| 27 | if r.Method != http.MethodPost { |
| 28 | return request, errorsx.WithStack(ErrInvalidRequest.WithHintf("HTTP method is '%s', expected 'POST'.", r.Method)) |
| 29 | } |
| 30 | if err := r.ParseForm(); err != nil { |
| 31 | return request, errorsx.WithStack(ErrInvalidRequest.WithHint("Unable to parse HTTP body, make sure to send a properly formatted form request body.").WithWrap(err).WithDebug(err.Error())) |
| 32 | } |
| 33 | if len(r.PostForm) == 0 { |
| 34 | return request, errorsx.WithStack(ErrInvalidRequest.WithHint("The POST body can not be empty.")) |
| 35 | } |
| 36 | request.Form = r.PostForm |
| 37 | |
| 38 | client, clientErr := f.AuthenticateClient(ctx, r, r.PostForm) |
| 39 | if clientErr != nil { |
| 40 | return request, clientErr |
| 41 | } |
| 42 | if client.GetID() != request.Form.Get("client_id") { |
| 43 | return request, errorsx.WithStack(ErrInvalidRequest.WithHint("Provided client_id mismatch.")) |
| 44 | } |
| 45 | request.Client = client |
| 46 | |
| 47 | if !client.GetGrantTypes().Has(string(GrantTypeDeviceCode)) { |
| 48 | return request, errorsx.WithStack(ErrInvalidGrant.WithHint("The requested OAuth 2.0 Client does not have the 'urn:ietf:params:oauth:grant-type:device_code' grant.")) |
| 49 | } |
| 50 | |
| 51 | if err := f.validateDeviceScope(ctx, r, request); err != nil { |
| 52 | return request, err |
| 53 | } |
| 54 | |
| 55 | if err := f.validateAudience(ctx, r, request); err != nil { |
| 56 | return request, err |
| 57 | } |
| 58 | |
| 59 | return request, nil |
| 60 | } |
| 61 | |
| 62 | func (f *Fosite) validateDeviceScope(ctx context.Context, r *http.Request, request *DeviceRequest) error { |
| 63 | scopes := RemoveEmpty(strings.Split(request.Form.Get("scope"), " ")) |