Scroll to navigation

Swagger2::Guides::ProtectedApi(3pm) User Contributed Perl Documentation Swagger2::Guides::ProtectedApi(3pm)

NAME

Swagger2::Guides::ProtectedApi - Protected API Guide

OVERVIEW

It is possible to protect your API: You can either use a "Custom route" or an "Around action hook". Both can serve the same purpose, but the around action hook can be customized for every API resource.

TUTORIAL

Around action hook

The "x-mojo-around-action" value is optional, but can hold the name of a method to call, which wraps around the autogenerated action which does input and output validation. This means that any data sent to the server is not yet converted into $input to your action.

Here is an example method which match the "x-mojo-around-action" from "Swagger specification", "MyApp::authenticate_api_request":

  package MyApp;
  sub authenticate_api_request {
    my ($next, $c, $action_spec) = @_;
    # Go to the action if the Authorization header is valid
    return $next->($c) if $c->req->headers->authorization eq "s3cret!";
    # ...or render an error if not
    return $c->render_swagger(
      {errors => [{message => "Invalid authorization key", path => "/"}]},
      {},
      401
    );
  }

"x-mojo-around-action" is also inherited from most levels, meaning that you define it globally for your whole API if you like:

  {
    "x-mojo-around-action": "MyApp::protect_any_resource",
    "paths": {
      "/pets": {
        "x-mojo-around-action": "MyApp::protect_any_method_under_foo",
        "get": {
          "x-mojo-around-action": "MyApp::protect_just_this_resource"
        }
      }
    }
  }

Custom route

  use Mojolicious::Lite;
  my $route = app->routes->under->to(
    cb => sub {
      my $c = shift;
      return 1 if $c->param('secret');
      return $c->render(json => {error => "Not authenticated"}, status => 401);
    }
  );
  plugin Swagger2 => {
    route => $route,
    url   => "data://api.json",
  };
  __DATA__
  @@ api.json
  {"swagger":"2.0", ...}

AUTHOR

Jan Henning Thorsen - "jhthorsen@cpan.org"

2016-04-17 perl v5.22.1