{"action":"created","comment":{"url":"https://api.github.com/repos/auth0/auth0-PHP/pulls/comments/221816129","pull_request_review_id":160555720,"id":221816129,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMTgxNjEyOQ==","diff_hunk":"@@ -5,160 +5,294 @@\n use Auth0\\SDK\\Exception\\CoreException;\n use Auth0\\SDK\\Exception\\InvalidTokenException;\n \n+use Auth0\\SDK\\Helpers\\Cache\\CacheHandler;\n use Auth0\\SDK\\Helpers\\JWKFetcher;\n use Firebase\\JWT\\JWT;\n \n+/**\n+ * Class JWTVerifier.\n+ * Used to validate JWTs issued by Auth0.\n+ *\n+ * @package Auth0\\SDK\n+ */\n class JWTVerifier\n {\n \n+    /**\n+     * Instance of JWKFetcher, injected or instantiated with this class's config options.\n+     *\n+     * @var JWKFetcher|null\n+     */\n     protected $JWKFetcher = null;\n \n-    protected $supported_algs = null;\n+    /**\n+     * Algorithms supported.\n+     * Only pass in the expected algorithm.\n+     *\n+     * @var array\n+     */\n+    protected $supported_algs = ['HS256'];\n \n-    protected $valid_audiences = null;\n+    /**\n+     * Audiences expected in the token.\n+     *\n+     * @var array\n+     */\n+    protected $valid_audiences;\n \n+    /**\n+     * Authorized issuing domain.\n+     * Required for RS256 tokens.\n+     *\n+     * @var array|null\n+     */\n     protected $authorized_iss = null;\n \n+    /**\n+     * Application Client Secret.\n+     * Required for HS256 tokens.\n+     *\n+     * @var string|null\n+     */\n     protected $client_secret = null;\n \n-    protected $secret_base64_encoded = null;\n-\n+    /**\n+     * Path to the JWKS for RS256 tokens.\n+     *\n+     * @var string\n+     */\n     protected $jwks_path = '.well-known/jwks.json';\n \n     /**\n      * JWTVerifier Constructor.\n      *\n-     * Configuration:\n-     *     - cache (CacheHandler) - Optional. Instance of CacheHandler to cache the JWKs.\n-     *     - supported_algs (Array) - Optional. The list of supported algorithms. By default only HS256.\n-     *     - client_secret (String) - Required (if supported HS256). The Auth0 application secret.\n-     *     - valid_audiences (Array) - Required. The list of audiences accepted by the service.\n-     *     - authorized_iss (Array) - Required (if supported RS256). The list of issuers trusted by the service.\n-     *     - guzzle_options (Array) - Optional. Extra configuration options sent to the Guzzle HTTP client.\n+     * @param array           $config     Uses the following keys:\n+     *                - valid_audiences (Array) - Required; list of audiences accepted by the service.\n+     *                - client_secret (String) - Required for HS256; Auth0 Application Client Secret.\n+     *                - authorized_iss (Array) - Required for RS256; list of issuers trusted by the service.\n+     *                - cache (CacheHandler) - Optional. Instance of CacheHandler to cache the JWKs.\n+     *                - supported_algs (Array) - List of supported algorithms; defaults to HS256.\n+     *                - guzzle_options (Array) - Extra configuration options sent to the Guzzle HTTP client.\n+     *                - jwks_path (string) - Path from the issuer domain to the JWKS; used for RS256.\n+     * @param JWKFetcher|null $jwkFetcher Instance of the JWKFetcher class to inject or null to instantiate.\n      *\n-     * @param  array $config\n-     * @throws CoreException\n+     * @throws CoreException If the suported_algs config key is set.\n+     * @throws CoreException If the valid_audiences config key is empty.\n+     * @throws CoreException If the token supports RS256 and the authorized_iss config key is empty.\n+     * @throws CoreException If the the token supports HS256 and the client_secret config key is empty.\n      */\n-    public function __construct($config)\n+    public function __construct(array $config, JWKFetcher $jwkFetcher = null)\n     {\n         $cache         = null;\n         $guzzleOptions = [];\n \n-        if (isset($config['cache'])) {\n-            $cache = $config['cache'];\n+        // Allow for dependency injection of a JWKFetcher object.\n+        $this->JWKFetcher = $jwkFetcher;\n+        if (! $this->JWKFetcher instanceof JWKFetcher) {\n+            // CacheHandler implementation to be used in JWKFetcher.\n+            if (isset($config['cache']) && $config['cache'] instanceof CacheHandler) {\n+                $cache = $config['cache'];\n+            }\n+\n+            // Pass in Guzzle client options, if present.\n+            if (isset($config['guzzle_options']) && is_array($config['guzzle_options'])) {\n+                $guzzleOptions = $config['guzzle_options'];\n+            }\n+\n+            $this->JWKFetcher = new JWKFetcher($cache, $guzzleOptions);\n         }\n \n-        if (isset($config['guzzle_options'])) {\n-            $guzzleOptions = $config['guzzle_options'];\n+        // JWKS path to use; see variable declaration above for default.\n+        if (isset($config['jwks_path'])) {\n+            $this->jwks_path = (string) $config['jwks_path'];\n         }\n \n+        // Legacy misspelling in JWT library.\n         if (isset($config['suported_algs'])) {\n             throw new CoreException('`suported_algs` was properly renamed to `supported_algs`.');\n         }\n \n-        if (! isset($config['supported_algs'])) {\n-            $config['supported_algs'] = ['HS256'];\n+        // Make sure we have audiences to check.\n+        if (empty($config['valid_audiences'])) {\n+            throw new CoreException('The audience is mandatory');\n         }\n \n-        if (! isset($config['secret_base64_encoded'])) {\n-            $config['secret_base64_encoded'] = true;\n-        }\n+        $this->valid_audiences = $config['valid_audiences'];\n \n-        if (! isset($config['valid_audiences'])) {\n-            throw new CoreException('The audience is mandatory');\n+        // Set the supported algorithms if passed; see variable declaration above for default.\n+        if (isset($config['supported_algs'])) {\n+            $this->supported_algs = $config['supported_algs'];\n         }\n \n-        if (! isset($config['authorized_iss'])) {\n-            if (in_array('RS256', $config['supported_algs'])) {\n-                throw new CoreException('The iss is mandatory when accepting RS256 signed tokens');\n-            } else {\n-                $config['authorized_iss'] = [];\n-            }\n+        // Check for algorithms that are not HS256 or RS256.\n+        $unsupported_algs = array_diff( $this->supported_algs, [ 'HS256', 'RS256' ] );\n+        if (! empty( $unsupported_algs )) {\n+            throw new CoreException(\n+                'Cannot support the following algorithm(s): '.implode( ', ', $unsupported_algs ).'.'","path":"src/JWTVerifier.php","position":158,"original_position":158,"commit_id":"281bd0bc804b8dca70b9c90138f4bbdc437c253f","original_commit_id":"281bd0bc804b8dca70b9c90138f4bbdc437c253f","user":{"login":"joshcanhelp","id":855223,"node_id":"MDQ6VXNlcjg1NTIyMw==","avatar_url":"https://avatars2.githubusercontent.com/u/855223?v=4","gravatar_id":"","url":"https://api.github.com/users/joshcanhelp","html_url":"https://github.com/joshcanhelp","followers_url":"https://api.github.com/users/joshcanhelp/followers","following_url":"https://api.github.com/users/joshcanhelp/following{/other_user}","gists_url":"https://api.github.com/users/joshcanhelp/gists{/gist_id}","starred_url":"https://api.github.com/users/joshcanhelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshcanhelp/subscriptions","organizations_url":"https://api.github.com/users/joshcanhelp/orgs","repos_url":"https://api.github.com/users/joshcanhelp/repos","events_url":"https://api.github.com/users/joshcanhelp/events{/privacy}","received_events_url":"https://api.github.com/users/joshcanhelp/received_events","type":"User","site_admin":false},"body":"Firebase supports algorithms that we don't so this kicks it back. \r\n\r\nThat said ... I could open it up to everything that Firebase supports:\r\n\r\nhttps://github.com/firebase/php-jwt/blob/master/src/JWT.php#L40\r\n\r\nDo `HS*` and `RS*` work like `HS256` and `RS256` in terms of the secret used?","created_at":"2018-10-02T03:17:49Z","updated_at":"2018-10-02T03:17:49Z","html_url":"https://github.com/auth0/auth0-PHP/pull/285#discussion_r221816129","pull_request_url":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/auth0/auth0-PHP/pulls/comments/221816129"},"html":{"href":"https://github.com/auth0/auth0-PHP/pull/285#discussion_r221816129"},"pull_request":{"href":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285"}},"in_reply_to_id":221764068},"pull_request":{"url":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285","id":213459189,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEzNDU5MTg5","html_url":"https://github.com/auth0/auth0-PHP/pull/285","diff_url":"https://github.com/auth0/auth0-PHP/pull/285.diff","patch_url":"https://github.com/auth0/auth0-PHP/pull/285.patch","issue_url":"https://api.github.com/repos/auth0/auth0-PHP/issues/285","number":285,"state":"open","locked":false,"title":"Add ID token validation","user":{"login":"joshcanhelp","id":855223,"node_id":"MDQ6VXNlcjg1NTIyMw==","avatar_url":"https://avatars2.githubusercontent.com/u/855223?v=4","gravatar_id":"","url":"https://api.github.com/users/joshcanhelp","html_url":"https://github.com/joshcanhelp","followers_url":"https://api.github.com/users/joshcanhelp/followers","following_url":"https://api.github.com/users/joshcanhelp/following{/other_user}","gists_url":"https://api.github.com/users/joshcanhelp/gists{/gist_id}","starred_url":"https://api.github.com/users/joshcanhelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshcanhelp/subscriptions","organizations_url":"https://api.github.com/users/joshcanhelp/orgs","repos_url":"https://api.github.com/users/joshcanhelp/repos","events_url":"https://api.github.com/users/joshcanhelp/events{/privacy}","received_events_url":"https://api.github.com/users/joshcanhelp/received_events","type":"User","site_admin":false},"body":"This SDK already had a `JWTVerifier` class to verify ID tokens but that class was not being used in the default login route. This PR adds this validation to `Auth0\\SDK\\Auth0::setIdToken()` before the incoming ID token is stored. Underlying validation library is [Firebase JWT](https://github.com/firebase/php-jwt).\r\n\r\n### What is validated\r\n\r\n- Issuer\r\n- Audience\r\n- Signature\r\n- NBF\r\n- IAT\r\n- Expiration\r\n\r\n### Potential issues\r\n\r\n#### NBF and IAT validation\r\n\r\nBoth of these values check a timecode in the token payload against the time set on the server doing the validation. If your server time is different from the issuing server, this could cause the validation to fail. If you're getting an error message stating `Cannot handle token prior to ...`, then you can try setting a leeway in the Firebase JWT library, like this:\r\n\r\n```php\r\n// Set this before the Auth0 class is initialized.\r\n// Value is in seconds and should be no greater than a few minutes.\r\n\r\n\\Firebase\\JWT\\JWT::$leeway = 30;\r\n\r\n// ... \r\n$auth0 = new Auth0( [ \r\n    // ...\r\n] );\r\n```\r\n\r\n#### Client Secret encoding\r\n\r\nMost tenants will not have a base64-encoded Client Secret but older tenants might. It will display on your Application settings page whether this is the case or not:\r\n\r\n![screenshot 2018-09-05 16 49 55](https://user-images.githubusercontent.com/855223/45127133-c0bb2380-b12b-11e8-882f-b45a988a91d4.png)\r\n\r\nBy default, the JWT verifier uses the Client Secret as-is with no decoding. If your Client Secret is encoded, add a new value to your `Auth0` initialization array like this:\r\n\r\n```php\r\n$auth0 = new Auth0( [ \r\n    // ...\r\n    'secret_base64_encoded' => true,\r\n    // ...\r\n] );\r\n```","created_at":"2018-09-05T23:52:25Z","updated_at":"2018-10-02T03:17:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bb381f685d6f4e1667201a324f1e44340f78c3f5","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":632198500,"node_id":"MDU6TGFiZWw2MzIxOTg1MDA=","url":"https://api.github.com/repos/auth0/auth0-PHP/labels/CH:%20Security","name":"CH: Security","color":"5319e7","default":false},{"id":950712149,"node_id":"MDU6TGFiZWw5NTA3MTIxNDk=","url":"https://api.github.com/repos/auth0/auth0-PHP/labels/Ready%20to%20Review","name":"Ready to Review","color":"0e8a16","default":false}],"milestone":{"url":"https://api.github.com/repos/auth0/auth0-PHP/milestones/8","html_url":"https://github.com/auth0/auth0-PHP/milestone/8","labels_url":"https://api.github.com/repos/auth0/auth0-PHP/milestones/8/labels","id":3420681,"node_id":"MDk6TWlsZXN0b25lMzQyMDY4MQ==","number":8,"title":"v5-Next","description":"","creator":{"login":"joshcanhelp","id":855223,"node_id":"MDQ6VXNlcjg1NTIyMw==","avatar_url":"https://avatars2.githubusercontent.com/u/855223?v=4","gravatar_id":"","url":"https://api.github.com/users/joshcanhelp","html_url":"https://github.com/joshcanhelp","followers_url":"https://api.github.com/users/joshcanhelp/followers","following_url":"https://api.github.com/users/joshcanhelp/following{/other_user}","gists_url":"https://api.github.com/users/joshcanhelp/gists{/gist_id}","starred_url":"https://api.github.com/users/joshcanhelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshcanhelp/subscriptions","organizations_url":"https://api.github.com/users/joshcanhelp/orgs","repos_url":"https://api.github.com/users/joshcanhelp/repos","events_url":"https://api.github.com/users/joshcanhelp/events{/privacy}","received_events_url":"https://api.github.com/users/joshcanhelp/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":16,"state":"open","created_at":"2018-06-13T04:36:01Z","updated_at":"2018-09-26T14:42:59Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285/commits","review_comments_url":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285/comments","review_comment_url":"https://api.github.com/repos/auth0/auth0-PHP/pulls/comments{/number}","comments_url":"https://api.github.com/repos/auth0/auth0-PHP/issues/285/comments","statuses_url":"https://api.github.com/repos/auth0/auth0-PHP/statuses/281bd0bc804b8dca70b9c90138f4bbdc437c253f","head":{"label":"auth0:add-id-token-validation","ref":"add-id-token-validation","sha":"281bd0bc804b8dca70b9c90138f4bbdc437c253f","user":{"login":"auth0","id":2824157,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI4MjQxNTc=","avatar_url":"https://avatars1.githubusercontent.com/u/2824157?v=4","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"repo":{"id":13683710,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY4MzcxMA==","name":"auth0-PHP","full_name":"auth0/auth0-PHP","private":false,"owner":{"login":"auth0","id":2824157,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI4MjQxNTc=","avatar_url":"https://avatars1.githubusercontent.com/u/2824157?v=4","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/auth0/auth0-PHP","description":"Auth0-PHP SDK","fork":false,"url":"https://api.github.com/repos/auth0/auth0-PHP","forks_url":"https://api.github.com/repos/auth0/auth0-PHP/forks","keys_url":"https://api.github.com/repos/auth0/auth0-PHP/keys{/key_id}","collaborators_url":"https://api.github.com/repos/auth0/auth0-PHP/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/auth0/auth0-PHP/teams","hooks_url":"https://api.github.com/repos/auth0/auth0-PHP/hooks","issue_events_url":"https://api.github.com/repos/auth0/auth0-PHP/issues/events{/number}","events_url":"https://api.github.com/repos/auth0/auth0-PHP/events","assignees_url":"https://api.github.com/repos/auth0/auth0-PHP/assignees{/user}","branches_url":"https://api.github.com/repos/auth0/auth0-PHP/branches{/branch}","tags_url":"https://api.github.com/repos/auth0/auth0-PHP/tags","blobs_url":"https://api.github.com/repos/auth0/auth0-PHP/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/auth0/auth0-PHP/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/auth0/auth0-PHP/git/refs{/sha}","trees_url":"https://api.github.com/repos/auth0/auth0-PHP/git/trees{/sha}","statuses_url":"https://api.github.com/repos/auth0/auth0-PHP/statuses/{sha}","languages_url":"https://api.github.com/repos/auth0/auth0-PHP/languages","stargazers_url":"https://api.github.com/repos/auth0/auth0-PHP/stargazers","contributors_url":"https://api.github.com/repos/auth0/auth0-PHP/contributors","subscribers_url":"https://api.github.com/repos/auth0/auth0-PHP/subscribers","subscription_url":"https://api.github.com/repos/auth0/auth0-PHP/subscription","commits_url":"https://api.github.com/repos/auth0/auth0-PHP/commits{/sha}","git_commits_url":"https://api.github.com/repos/auth0/auth0-PHP/git/commits{/sha}","comments_url":"https://api.github.com/repos/auth0/auth0-PHP/comments{/number}","issue_comment_url":"https://api.github.com/repos/auth0/auth0-PHP/issues/comments{/number}","contents_url":"https://api.github.com/repos/auth0/auth0-PHP/contents/{+path}","compare_url":"https://api.github.com/repos/auth0/auth0-PHP/compare/{base}...{head}","merges_url":"https://api.github.com/repos/auth0/auth0-PHP/merges","archive_url":"https://api.github.com/repos/auth0/auth0-PHP/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/auth0/auth0-PHP/downloads","issues_url":"https://api.github.com/repos/auth0/auth0-PHP/issues{/number}","pulls_url":"https://api.github.com/repos/auth0/auth0-PHP/pulls{/number}","milestones_url":"https://api.github.com/repos/auth0/auth0-PHP/milestones{/number}","notifications_url":"https://api.github.com/repos/auth0/auth0-PHP/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/auth0/auth0-PHP/labels{/name}","releases_url":"https://api.github.com/repos/auth0/auth0-PHP/releases{/id}","deployments_url":"https://api.github.com/repos/auth0/auth0-PHP/deployments","created_at":"2013-10-18T16:51:11Z","updated_at":"2018-09-26T14:43:01Z","pushed_at":"2018-09-28T17:28:57Z","git_url":"git://github.com/auth0/auth0-PHP.git","ssh_url":"git@github.com:auth0/auth0-PHP.git","clone_url":"https://github.com/auth0/auth0-PHP.git","svn_url":"https://github.com/auth0/auth0-PHP","homepage":null,"size":748,"stargazers_count":150,"watchers_count":150,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":95,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":95,"open_issues":8,"watchers":150,"default_branch":"master"}},"base":{"label":"auth0:master","ref":"master","sha":"20038ed6886dbdcffe1df720a8f12c3e68e7f7d3","user":{"login":"auth0","id":2824157,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI4MjQxNTc=","avatar_url":"https://avatars1.githubusercontent.com/u/2824157?v=4","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"repo":{"id":13683710,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY4MzcxMA==","name":"auth0-PHP","full_name":"auth0/auth0-PHP","private":false,"owner":{"login":"auth0","id":2824157,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI4MjQxNTc=","avatar_url":"https://avatars1.githubusercontent.com/u/2824157?v=4","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/auth0/auth0-PHP","description":"Auth0-PHP SDK","fork":false,"url":"https://api.github.com/repos/auth0/auth0-PHP","forks_url":"https://api.github.com/repos/auth0/auth0-PHP/forks","keys_url":"https://api.github.com/repos/auth0/auth0-PHP/keys{/key_id}","collaborators_url":"https://api.github.com/repos/auth0/auth0-PHP/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/auth0/auth0-PHP/teams","hooks_url":"https://api.github.com/repos/auth0/auth0-PHP/hooks","issue_events_url":"https://api.github.com/repos/auth0/auth0-PHP/issues/events{/number}","events_url":"https://api.github.com/repos/auth0/auth0-PHP/events","assignees_url":"https://api.github.com/repos/auth0/auth0-PHP/assignees{/user}","branches_url":"https://api.github.com/repos/auth0/auth0-PHP/branches{/branch}","tags_url":"https://api.github.com/repos/auth0/auth0-PHP/tags","blobs_url":"https://api.github.com/repos/auth0/auth0-PHP/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/auth0/auth0-PHP/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/auth0/auth0-PHP/git/refs{/sha}","trees_url":"https://api.github.com/repos/auth0/auth0-PHP/git/trees{/sha}","statuses_url":"https://api.github.com/repos/auth0/auth0-PHP/statuses/{sha}","languages_url":"https://api.github.com/repos/auth0/auth0-PHP/languages","stargazers_url":"https://api.github.com/repos/auth0/auth0-PHP/stargazers","contributors_url":"https://api.github.com/repos/auth0/auth0-PHP/contributors","subscribers_url":"https://api.github.com/repos/auth0/auth0-PHP/subscribers","subscription_url":"https://api.github.com/repos/auth0/auth0-PHP/subscription","commits_url":"https://api.github.com/repos/auth0/auth0-PHP/commits{/sha}","git_commits_url":"https://api.github.com/repos/auth0/auth0-PHP/git/commits{/sha}","comments_url":"https://api.github.com/repos/auth0/auth0-PHP/comments{/number}","issue_comment_url":"https://api.github.com/repos/auth0/auth0-PHP/issues/comments{/number}","contents_url":"https://api.github.com/repos/auth0/auth0-PHP/contents/{+path}","compare_url":"https://api.github.com/repos/auth0/auth0-PHP/compare/{base}...{head}","merges_url":"https://api.github.com/repos/auth0/auth0-PHP/merges","archive_url":"https://api.github.com/repos/auth0/auth0-PHP/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/auth0/auth0-PHP/downloads","issues_url":"https://api.github.com/repos/auth0/auth0-PHP/issues{/number}","pulls_url":"https://api.github.com/repos/auth0/auth0-PHP/pulls{/number}","milestones_url":"https://api.github.com/repos/auth0/auth0-PHP/milestones{/number}","notifications_url":"https://api.github.com/repos/auth0/auth0-PHP/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/auth0/auth0-PHP/labels{/name}","releases_url":"https://api.github.com/repos/auth0/auth0-PHP/releases{/id}","deployments_url":"https://api.github.com/repos/auth0/auth0-PHP/deployments","created_at":"2013-10-18T16:51:11Z","updated_at":"2018-09-26T14:43:01Z","pushed_at":"2018-09-28T17:28:57Z","git_url":"git://github.com/auth0/auth0-PHP.git","ssh_url":"git@github.com:auth0/auth0-PHP.git","clone_url":"https://github.com/auth0/auth0-PHP.git","svn_url":"https://github.com/auth0/auth0-PHP","homepage":null,"size":748,"stargazers_count":150,"watchers_count":150,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":95,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":95,"open_issues":8,"watchers":150,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285"},"html":{"href":"https://github.com/auth0/auth0-PHP/pull/285"},"issue":{"href":"https://api.github.com/repos/auth0/auth0-PHP/issues/285"},"comments":{"href":"https://api.github.com/repos/auth0/auth0-PHP/issues/285/comments"},"review_comments":{"href":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285/comments"},"review_comment":{"href":"https://api.github.com/repos/auth0/auth0-PHP/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/auth0/auth0-PHP/pulls/285/commits"},"statuses":{"href":"https://api.github.com/repos/auth0/auth0-PHP/statuses/281bd0bc804b8dca70b9c90138f4bbdc437c253f"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"joshcanhelp"}}