A PHP implementation of ActivityPub protocol based upon the ActivityStreams 2.0 data format.

Overview

ActivityPhp

Build Status Maintainability Test Coverage

ActivityPhp is an implementation of ActivityPub layers in PHP.

It provides two layers:

  • A client to server protocol, or "Social API" This protocol permits a client to act on behalf of a user.
  • A server to server protocol, or "Federation Protocol" This protocol is used to distribute activities between actors on different servers, tying them into the same social graph.

As the two layers are implemented, it aims to be an ActivityPub conformant Federated Server

All normalized types are implemented too. If you need to create a new one, just extend existing types.

See the full documentation or an overview below.

Table of contents


Requirements

  • Supports PHP 7.2+ | 8.0

Install

composer require landrok/activitypub

ActivityStreams Core Types

All core types are provided:

use ActivityPhp\Type\Core\Activity;
use ActivityPhp\Type\Core\Collection;
use ActivityPhp\Type\Core\CollectionPage;
use ActivityPhp\Type\Core\IntransitiveActivity;
use ActivityPhp\Type\Core\Link;
use ActivityPhp\Type\Core\ObjectType;
use ActivityPhp\Type\Core\OrderedCollection;
use ActivityPhp\Type\Core\OrderedCollectionPage;

ActivityStreams Extended Types

All extended types are provided:

Actor types

use ActivityPhp\Type\Extended\Actor\Application;
use ActivityPhp\Type\Extended\Actor\Group;
use ActivityPhp\Type\Extended\Actor\Organization;
use ActivityPhp\Type\Extended\Actor\Person;
use ActivityPhp\Type\Extended\Actor\Service;

Activity types

use ActivityPhp\Type\Extended\Activity\Accept;
use ActivityPhp\Type\Extended\Activity\Add;
use ActivityPhp\Type\Extended\Activity\Announce;
use ActivityPhp\Type\Extended\Activity\Arrive;
use ActivityPhp\Type\Extended\Activity\Block;
use ActivityPhp\Type\Extended\Activity\Create;
use ActivityPhp\Type\Extended\Activity\Delete;
use ActivityPhp\Type\Extended\Activity\Dislike;
use ActivityPhp\Type\Extended\Activity\Flag;
use ActivityPhp\Type\Extended\Activity\Follow;
use ActivityPhp\Type\Extended\Activity\Ignore;
use ActivityPhp\Type\Extended\Activity\Invite;
use ActivityPhp\Type\Extended\Activity\Join;
use ActivityPhp\Type\Extended\Activity\Leave;
use ActivityPhp\Type\Extended\Activity\Like;
use ActivityPhp\Type\Extended\Activity\Listen;
use ActivityPhp\Type\Extended\Activity\Move;
use ActivityPhp\Type\Extended\Activity\Offer;
use ActivityPhp\Type\Extended\Activity\Question;
use ActivityPhp\Type\Extended\Activity\Read;
use ActivityPhp\Type\Extended\Activity\Reject;
use ActivityPhp\Type\Extended\Activity\Remove;
use ActivityPhp\Type\Extended\Activity\TentativeAccept;
use ActivityPhp\Type\Extended\Activity\TentativeReject;
use ActivityPhp\Type\Extended\Activity\Travel;
use ActivityPhp\Type\Extended\Activity\Undo;
use ActivityPhp\Type\Extended\Activity\Update;
use ActivityPhp\Type\Extended\Activity\View;

Object types

use ActivityPhp\Type\Extended\Object\Article;
use ActivityPhp\Type\Extended\Object\Audio;
use ActivityPhp\Type\Extended\Object\Document;
use ActivityPhp\Type\Extended\Object\Event;
use ActivityPhp\Type\Extended\Object\Image;
use ActivityPhp\Type\Extended\Object\Mention;
use ActivityPhp\Type\Extended\Object\Note;
use ActivityPhp\Type\Extended\Object\Page;
use ActivityPhp\Type\Extended\Object\Place;
use ActivityPhp\Type\Extended\Object\Profile;
use ActivityPhp\Type\Extended\Object\Relationship;
use ActivityPhp\Type\Extended\Object\Tombstone;
use ActivityPhp\Type\Extended\Object\Video;

Types

Type factory

You can instanciate ActivityStreams types using their short name.

use ActivityPhp\Type;

$link = Type::create('Link');
$note = Type::create('Note');

Instanciating a type and setting properties is possible with the second parameter.

use ActivityPhp\Type;

$note = Type::create('Note', [
    'content' => 'A content for my note'
]);

Starting from an array with a 'type' key, it's even possible to directly instanciate your type.

use ActivityPhp\Type;

$array = [
    'type'    => 'Note',
    'content' => 'A content for my note'
];

$note = Type::create($array);

Properties names

Whatever be your object or link, you can get all properties names with getProperties() method.

use ActivityPhp\Type;

$link = Type::create('Link');

print_r(
    $link->getProperties()
);

Would output something like:

Array
(
    [0] => type
    [1] => id
    [2] => name
    [3] => nameMap
    [4] => href
    [5] => hreflang
    [6] => mediaType
    [7] => rel
    [8] => height
    [9] => preview
    [10] => width
)

All properties and their values

In order to dump all properties and associated values, use toArray() method.

use ActivityPhp\Type;

$link = Type::create('Link');
$link->setName('An example');
$link->setHref('http://example.com');

print_r(
    $link->toArray()
);

Would output something like:

Array
(
    [type] => Link
    [name] => An example
    [href] => http://example.com
)

Get a property

There are 3 equivalent ways to get a value.

use ActivityPhp\Type;

$note = Type::create('Note');

// Each method returns the same value
echo $note->id;
echo $note->get('id');
echo $note->getId();

Set a property

There are 3 equivalent ways to set a value.

use ActivityPhp\Type;

$note = Type::create('Note');

$note->id = 'https://example.com/custom-notes/1';
$note->set('id', 'https://example.com/custom-notes/1');
$note->setId('https://example.com/custom-notes/1');

Whenever you assign a value, the format of this value is checked.

This action is made by a validator. If rules are not respected an Exception is thrown.

When a property does not exist, an Exception is thrown in strict mode. You can define 3 different behaviours:

  • throw an exception (default=strict)
  • ignore property (ignore)
  • set property (include)
use ActivityPhp\Type;
use ActivityPhp\Type\TypeConfiguration;

$note = Type::create('Note');

// Ignore mode
TypeConfiguration::set('undefined_properties', 'ignore');
$note->undefinedProperty = 'https://example.com/custom-notes/1';
echo $note->undefinedProperty; // null

// Include mode
TypeConfiguration::set('undefined_properties', 'include');
$note->undefinedProperty = 'https://example.com/custom-notes/1';
echo $note->undefinedProperty; // https://example.com/custom-notes/1

// Strict mode
TypeConfiguration::set('undefined_properties', 'strict');
$note->undefinedProperty = 'https://example.com/custom-notes/1'; // Exception

Set several properties

With Type factory, you can instanciate a type and set several properties.

use ActivityPhp\Type;

$note = Type::create('Note', [
    'id'   => 'https://example.com/custom-notes/1',
    'name' => 'An important note',
]);

Create a copy

Sometimes you may use a copy in order not to affect values of the original type.

use ActivityPhp\Type;

$note = Type::create('Note', ['name' => 'Original name']);

$copy = $note->copy()->setName('Copy name');

echo $copy->name; // Copy name
echo $note->name; // Original name

You can copy and chain methods to affect only values of the copied type.


Check if a property exists

use ActivityPhp\Type;

$note = Type::create('Note');

echo $note->has('id'); // true
echo $note->has('anotherProperty'); // false

Use native types

All core and extended types are used with a classic instanciation.

use ActivityPhp\Type\Extended\Object\Note;

$note = new Note();

Same way with Type factory:

use ActivityPhp\Type;

$note = Type::create('Note');

Use your own extended types

If you need some custom attributes, you can extend predefined types.

  • Create your custom type:
use ActivityPhp\Type\Extended\Object\Note;

class MyNote extends Note
{
    // Override basic type
    protected $type = 'CustomNote';

    // Custom property
    protected $myProperty;
}

There are 2 ways to instanciate a type:

  • A classic PHP call:
$note = new MyNote();
$note->id = 'https://example.com/custom-notes/1';
$note->myProperty = 'Custom Value';

echo $note->getMyProperty(); // Custom Value
  • With the Type factory:
use ActivityPhp\Type;

$note = Type::create('MyNote', [
    'id' => 'https://example.com/custom-notes/1',
    'myProperty' => 'Custom Value'
]);

Extending types preserves benefits of getters, setters and their validators.


Create your own property validator

Use a custom property validator when you define custom attributes or when you want to override ActivityPub attribute default validation.

Regarding to previous example with a custom attribute $myProperty, if you try to set this property, it would be done without any check on values you're providing.

You can easily cope with that implementing a custom validator using Validator.

use ActivityPhp\Type\ValidatorInterface;
use ActivityPhp\Type\Validator;

// Create a custom validator that implements ValidatorInterface
class MyPropertyValidator implements ValidatorInterface
{
    // A public validate() method is mandatory
    public function validate($value, $container)
    {
        return true;
    }
}

// Attach this custom validator to a property
Validator::add('myProperty', MyPropertyValidator::class);

// Now all values are checked with the validate() method
// 'myProperty' is passed to the first argument
// $note is passed to the second one.

$note->myProperty = 'Custom Value';

An equivalent way is to use Type factory and addValidator() method:

use ActivityPhp\Type;

// Attach this custom validator to a property
Type::addValidator('myProperty', MyPropertyValidator::class);

Server

A server instance is an entry point of a federation.

Its purpose is to receive, send and forward activities appropriately.

A minimal approach is:

use ActivityPhp\Server;

$server = new Server();

For more configuration parameters, See the full documentation

WebFinger

WebFinger is a protocol that allows for discovery of information about people.

Given a handle, ActivityPub instances can discover profiles using this protocol.

use ActivityPhp\Server;

$server = new Server();

$handle = '[email protected]';

// Get a WebFinger instance
$webfinger = $server->actor($handle)->webfinger();

In this implementation, we can use an Object Identifier (URI) instead of a WebFinger handle.

use ActivityPhp\Server;

$server = new Server();

$handle = 'https://example.org/users/bob';

// Get a WebFinger instance
$webfinger = $server->actor($handle)->webfinger();

WebFinger::toArray()

Get all WebFinger data as an array.

use ActivityPhp\Server;

$server = new Server();

$handle = '[email protected]';

// Get a WebFinger instance
$webfinger = $server->actor($handle)->webfinger();

// Dumps all properties
print_r($webfinger->toArray());

// A one line call
print_r(
    $server->actor($handle)->webfinger()->toArray()
);

Would output something like:

Array
(
    [subject] => acct:[email protected]
    [aliases] => Array
        (
            [0] => http://example.org/users/bob
        )
    [links] => Array
        (
            [0] => Array
                (
                    [rel] => self
                    [type] => application/activity+json
                    [href] => http://example.org/users/bob
                )
        )
)

WebFinger::getSubject()

Get a WebFinger resource.

echo $webfinger->getSubject();

// Would output 'acct:[email protected]'

WebFinger::getProfileId()

Get ActivityPub object identifier (URI).

echo $webfinger->getProfileId();

// Would output 'http://example.org/users/bob'

WebFinger::getHandle()

Get a profile handle.

echo $webfinger->getHandle();

// Would output '[email protected]'

WebFinger::getAliases()

Get all aliases entries for this profile.

print_r(
    $webfinger->getAliases()
);

Would output something like:

Array
(
    [0] => http://example.org/users/bob
)

WebFinger::getLinks()

Get all links entries for this profile.

print_r(
    $webfinger->getLinks()
);

Would output something like:

Array
(
    [0] => Array
        (
            [rel] => self
            [type] => application/activity+json
            [href] => http://example.org/users/bob
        )
)


More

Comments
  • Be more forgiven about (some) undefined properties?

    Be more forgiven about (some) undefined properties?

    There's validation when trying to create an object, which is great.

    However, it looks like mastodon added a 'featured' property, so trying to get the webfinger info from say [email protected] results now in

    In AbstractObject.php line 137:
                                                                                                                                                                                                                      
      Property "featured" is not defined. Type="Service", Class="ActivityPhp\Type\Extended\Actor\Service" 
    

    I haven't fully dived into the code yet, and I can probably add it the feature/property myself with custom code. However, it still means we'd have to keep an eye on the logs in case some service decided to add another one which would break everything again.

    enhancement question 
    opened by swentel 7
  • Httpsignature verification failing

    Httpsignature verification failing

    I've started verifying incoming activities now in the Drupal module. However, most are failing. As a consequence, incoming messages (even from followers) are unpublished and not visible on the timeline.

    This is probably due to https://github.com/tootsuite/mastodon/pull/14556 - I had to change the creation of the signature because of this change when sending out activities to my followers.

    Tricky stuff :) I'll dig in deeper myself first to figure out what needs to change and run it in my environment for a few days once I got something.

    bug enhancement 
    opened by swentel 5
  • Signature pattern failed with Mastodon/Pleroma requests

    Signature pattern failed with Mastodon/Pleroma requests

    The signature field in the request was keyId="https://domain/path#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="zRbQw......0MUqA==", and I suspect that the algorithm="rsa-sha256" field has caused this problem. (By the way, requests from both Mastodon and Pleroma seem to be using rsa-sha256.)

    Can this be fixed somehow? Thanks!

    bug 
    opened by gudzpoz 3
  • Use webfinger for public key and client side signing

    Use webfinger for public key and client side signing

    Hi, I start to play with webfinger and webrtc and would like to use your ActivityPub library because my small project could be extended with activitypub features later... So I know it's a little bit of topic, but I hope you could help me to be compatible with your project 😅

    Two questions about how to use it.

    1. It looks like webfinger would be nice to store a public key used for signature verification and optional encryption. Is it possible to add a public key to the webfinger user "file" and is it possible to get that attribute with your webfinger implementation?

    2. Content should be signed / encrypted client side. So how to do it with JavaScript to be compatible to HttpSignature::verify()? Client side encryption library examples:

    • https://github.com/intelliBrain/cryptico-js
    • https://github.com/travist/jsencrypt
    question 
    opened by pwFoo 3
  • Use some sort of cache in WebfingerFactory

    Use some sort of cache in WebfingerFactory

    When using following code:

    $webfinger = $server->actor($handle)->webfinger();
    

    The call to the webfinger url happens twice

    • first in __construct of Actor.php
    • then in webfinger()

    There's a property webfingers, but a quick debug by adding in the get() method of the factory doesn't help, because well, it's static (unless I miss something very stupid here).

    Not sure what the most elegant way would be to handle it.

    enhancement question 
    opened by swentel 2
  • 0.4.0 release?

    0.4.0 release?

    Hi,

    I'm (finally) working on ActivityPub for Drupal using your library, and it's coming along well.

    I was wondering whether you have an ETA to tag a new release? That would allow me to set a stable tag in my composer file, instead of having to rely on dev/master branch.

    Thanks!

    opened by swentel 2
  • Update TypeConfiguration namespace in readme

    Update TypeConfiguration namespace in readme

    Hi there,

    thank you for creating this library! It is very useful, and I'm using it in one of my projects. I noticed that one of the examples in the readme shows the wrong namespace for TypeConfiguration.

    This patch updates the namespace of TypeConfiguration in the readme example to ActivityPhp\Type\TypeConfiguration.

    opened by snorpey 1
  • Allow passing custom User Agent to the request object

    Allow passing custom User Agent to the request object

    Depending on the context, it might be necessary to pass on a different user agent. In my case, this is because the tests in Drupal spawn a separate Drupal which is only accessible if the right user agent is passed on in guzzle user agents.

    opened by swentel 1
  • Cache miss even though an entry should be found

    Cache miss even though an entry should be found

    It looks like, even though cache is written to the file system, the cache is missed on the next request.

    Some sample code; Note: the functions return ttl and the actual path which are configurable in the drupal module, but it also happens with the default cache settings.

        $config += [
          'cache' => [
            'ttl' => activitypub_cache_ttl(),
            'stream' => activitypub_cache_path()
          ],
        ];
        $config['instance']['types'] = 'ignore';
        return new Server($config);
    
      ...
    
      $server->actor($target)->get('inbox')
    

    I did some naive debugging in Request.php to find out it didn't get into the ::has statement

            print_r("CHECKING $url");
            if (CacheHelper::has($url)) {
                print_r("FOUND");
                return CacheHelper::get($url);
            }
            try {
                print_r("DAMN");
                $content = $this->client->get($url)->getBody()->getContents();
            } catch (\GuzzleHttp\Exception\ClientException $exception) {
                throw new Exception($exception->getMessage());
            }
    
            CacheHelper::set($url, $content);
    
            return $content;
    
    opened by swentel 1
  • Signature pattern too strict

    Signature pattern too strict

    The signature pattern is quite strict on the padding signs at the end. I'm getting signatures now and then with one or sometimes without equal signs in the end. So something like underneath makes the preg match work fine. Unless there's a requirement for having two there, but I don't think so :)

    /^
            keyId="(?P<keyId>
                (https?:\/\/[\w\-\.]+[\w]+)
                (:[\d]+)?
                ([\w\-\.#\/@]+)
            )",
            (headers="\(request-target\) (?P<headers>[\w\s]+)",)?
            signature="(?P<signature>[\w+\/]+={0,2})"
        /x
    
    opened by swentel 1
  • Pattern now matches fields with hyphens

    Pattern now matches fields with hyphens

    The original pattern would miss fields like 'content-length', which is used in Pleroma's signature.

    However, when I went to check https://tools.ietf.org/html/rfc7230:

         header-field   = field-name ":" OWS field-value OWS
    
         field-name     = token
    
         token          = 1*tchar
    
         tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
                        / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
                        / DIGIT / ALPHA
                        ; any VCHAR, except delimiters
    

    it seems that the pattern could be further extended. ( But I do think that all headers nowadays will match [\w\s-] anyway :P )

    opened by gudzpoz 0
  • Recherche développeur Activity Pub

    Recherche développeur Activity Pub

    Bonjour Nous cherchons un developpeur pour intégré AP dans un projet open source en PHP c'est une bouteille à la mer , on sait jamais merci et désolé si c'est pas le bon endroit

    opened by oceatoon 0
  • Minds Integration

    Minds Integration

    Hi, I'm founder of minds.com, an open source social net with a few million users. I tried to reach out on cybre.space but couldn't get in. Pls let me know if we can connect. We are very interested in funding dev here.

    https://gitlab.com/minds/minds/-/issues/90

    opened by ottman 0
  • WordPress compatibility

    WordPress compatibility

    Hey @landrok , I am the author of the WordPress ActivityPub Plugin (https://github.com/pfefferle/wordpress-activitypub) and @mediaformat and I investigated if it is possible to use your lib in the plugin, so I have some questions.

    • WordPress comes with it's own API endpoints and with it's request handlers, do you see a way to provide a bit more generic way to verify requests, withouth the requirement of guzzle or symfony?
    • Because we can't use the server part of your lib, what do you think about a fromJson method for the Activity Objects, so that we will be able to init the objects, using the JSON request?
    enhancement 
    opened by pfefferle 8
  • Examples

    Examples

    Hi. I'm not an expert in using my brain :P I've tried from the documentation to understand how the code works (+ ActivityPub from online texts), but I don't know how to use these projects realistically, and I wouldn't want to create my own protocol. Can you write different simple examples of different functions?

    For example:

    • Creating a user for ActivityPub (what data is needed) [of course can be given from the code].
    • Creating an entry based on the data
    • Retrieving an entry from another instance
    • Retrieving user data

    And so on.

    If possible, of course.

    question Documentation 
    opened by IntinteDAO 2
  • [Question] How use that library or build a pubgate like project?

    [Question] How use that library or build a pubgate like project?

    I'm not a programmer / developer, so I don't think I could design or realize such a project in needed quality...

    I searched for a universal solution for a multi user / multi domain blog (one user can have different author names and blog domains) as alternative to multiple blog installations (plume, writefreely or some other solution).

    I found https://github.com/autogestion/pubgate which looks like a activitypub headless cms (database + api). I really like that way and would ask if there is a project like that build on top of that library with php?

    Who uses landrok/acticitypub?

    question 
    opened by pwFoo 1
Releases(0.5.6)
  • 0.5.6(Apr 11, 2021)

  • 0.5.5(Jan 31, 2021)

  • 0.5.4(Nov 6, 2020)

  • 0.5.3(Nov 6, 2020)

  • 0.5.2(Oct 29, 2020)

  • 0.5.1(Oct 22, 2020)

  • 0.5.0(Oct 8, 2020)

    Server features

    • Add support for a more tolerant type validation for instance
    • Add support for cache customization for instance
    • Add support for PHP 8.0
    Source code(tar.gz)
    Source code(zip)
  • 0.4.1(Sep 28, 2020)

  • 0.4.0(Aug 26, 2020)

  • 0.3.0(Jul 22, 2019)

    Features

    API changes

    Changes on properties validators:

    • attachment nows supports AS2 objects
    • mediaType now accepts null value
    • object and id now accept OStatus tag
    • href now accepts AS2 Link objects

    Fixed

    • Fix Laravel 5.8 install
    • Fix namespace conflicts for external facades
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Feb 24, 2019)

    Features

    Namespace

    Change library global namespace from ActivityPub to ActivityPhp

    Type factory

    ActivityPhp\Type::create() can now be called with an array.

    ActivityPhp\Type::create([
        'type' => 'Person', 
        'name' => 'A name'
    ])
    

    is equivalent to :

    ActivityPhp\Type::create(
        'Person',
        ['name' => 'A name']
    )
    

    Type copying

    You can now copy a type:

    $original = ActivityPhp\Type::create([
        'type' => 'Person', 
        'name' => 'A name'
    ]);
    $copy = $original->copy();
    
    

    Properties validators

    Based on real world tests, some property validators have been modified:

    • name, content now accepts null values
    • attachment, tag, to, bto, cc, bcc now accepts empty arrays
    • attributedTo and url now supports arrays

    Server

    Server features (Manual):

    • External WebFinger discovery
    • External profiles discovery
    • Public outbox browsing
    • Support for Mastodon handles

    Add a minimal server stack of configurations (Manual):

    • logger
    • caching
    • basic instance
    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Jan 9, 2019)

Owner
Landrok
Landrok
Middleware to generate access logs for each request using the Apache's access log format

Middleware to generate access logs for each request using the Apache's access log format. This middleware requires a Psr log implementation, for example monolog.

Middlewares 20 Jun 23, 2022
Hawk — A PHP Implementation

Hawk — A PHP Implementation Hawk is an HTTP authentication scheme using a message authentication code (MAC) algorithm to provide partial HTTP request

dflydev 68 Mar 16, 2022
PHP implementation of openid connect-core

OIDC Discovery PHP implementation of https://openid.net/specs/openid-connect-core-1_0.html Install Via Composer $ composer require digitalcz/openid-co

DigitalCz 3 Dec 14, 2022
A Laravel 5 package for OAuth Social Login/Register implementation using Laravel socialite and (optionally) AdminLTE Laravel package

laravel-social A Laravel 5 package for OAuth Social Login/Register implementation using Laravel socialite and (optionally) AdminLTE Laravel package. I

Sergi Tur Badenas 42 Nov 29, 2022
OAuth server implementation for WP API

WP REST API - OAuth 1.0a Server Connect applications to your WordPress site without ever giving away your password. This plugin uses the OAuth 1.0a pr

WordPress REST API Team 314 Dec 10, 2022
Single file PHP that can serve as a JWT based authentication provider to the PHP-CRUD-API project

Single file PHP that can serve as a JWT based authentication provider to the PHP-CRUD-API project

Maurits van der Schee 163 Dec 18, 2022
A flexible, driver based Acl package for PHP 5.4+

Lock - Acl for PHP 5.4+ I'm sad to say that Lock is currently not maintained. I won't be able to offer support or accept new contributions for the cur

Beatswitch 892 Dec 30, 2022
Kaiju is an open source verification bot based on Discord's OAuth written in C# and PHP, with the functionality of being able to integrate the user to a new server in case yours is suspended.

What is Kaiju? Kaiju is an open source verification bot for Discord servers, based on OAuth and with permission for the server owner, to be able to mi

in the space 10 Nov 20, 2022
A PHP boilerplate based on Slim Framework, for start projects with Eloquent ORM, Validation, Auth (JWT), Repositories and Transformers ready

A PHP boilerplate based on Slim Framework, for start projects with Eloquent ORM, Validation, Auth (JWT), Repositories and Transformers ready.

Damiano Petrungaro 58 Aug 10, 2022
Role-based Permissions for Laravel 5

ENTRUST (Laravel 5 Package) Entrust is a succinct and flexible way to add Role-based Permissions to Laravel 5. If you are looking for the Laravel 4 ve

Zizaco 6.1k Jan 5, 2023
Minimalistic token-based authorization for Laravel API endpoints.

Bearer Minimalistic token-based authorization for Laravel API endpoints. Installation You can install the package via Composer: composer require ryang

Ryan Chandler 74 Jun 17, 2022
A support-rich server software for Minecraft Bedrock Edition based on PocketMine-MP.

A support-rich server software for Minecraft Bedrock Edition based on PocketMine-MP. Credits @ItzLightyHD -> Adding features to OpenTouch (new API, mo

ApexieDevelopment 27 Aug 31, 2021
Light-weight role-based permissions system for Laravel 6+ built in Auth system.

Kodeine/Laravel-ACL Laravel ACL adds role based permissions to built in Auth System of Laravel 8.0+. ACL middleware protects routes and even crud cont

Kodeine 781 Dec 15, 2022
Configurable Basic Auth based on Pimcore Documents

CORS Property Basic Auth This bundles allows to add basic auth based on Properties on Pimcore Documents. Simply use these properties password_enabled

CORS GmbH 1 Nov 12, 2021
Manage authorization with granular role-based permissions in your Laravel Apps.

Governor For Laravel Manage authorization with granular role-based permissions in your Laravel apps. Goal Provide a simple method of managing ACL in a

GeneaLabs, LLC 149 Dec 23, 2022
Tech-Admin is Laravel + Bootstrap Admin Panel With User Management And Access Control based on Roles and Permissions.

Tech-Admin | Laravel 8 + Bootstrap 4 Tech-Admin is Admin Panel With Preset of Roles, Permissions, ACL, User Management, Profile Management. Features M

TechTool India 39 Dec 23, 2022
Multi-factor Authentication using a Public PGP key for web based applications

PGPmfa() a PHP Class for PGP Multi-factor Authentication using a Public PGP key for web based applications Multi-factor Authentication with PGP Second

null 2 Nov 27, 2022
Hierarchical Rol-Permission Based Laravel Auth Package with Limitless Hierarchical Level of Organizations

AAuth for Laravel Hierarchical Rol-Permission Based Laravel Auth Package with Limitless Hierarchical Level of Organizations Features Organization Base

Aurora Web Software Team 23 Dec 27, 2022
php database agnostic authentication library for php developers

Whoo Whoo is a database agnostic authentication library to manage authentication operation easily. Whoo provides you a layer to access and manage user

Yunus Emre Bulut 9 Jan 15, 2022