{"action":"closed","number":65,"pull_request":{"url":"https://api.github.com/repos/thisissoon/FM-API/pulls/65","id":41387607,"html_url":"https://github.com/thisissoon/FM-API/pull/65","diff_url":"https://github.com/thisissoon/FM-API/pull/65.diff","patch_url":"https://github.com/thisissoon/FM-API/pull/65.patch","issue_url":"https://api.github.com/repos/thisissoon/FM-API/issues/65","number":65,"state":"closed","locked":false,"title":"Feature: Allow Known Clients","user":{"login":"krak3n","id":112322,"avatar_url":"https://avatars.githubusercontent.com/u/112322?v=3","gravatar_id":"","url":"https://api.github.com/users/krak3n","html_url":"https://github.com/krak3n","followers_url":"https://api.github.com/users/krak3n/followers","following_url":"https://api.github.com/users/krak3n/following{/other_user}","gists_url":"https://api.github.com/users/krak3n/gists{/gist_id}","starred_url":"https://api.github.com/users/krak3n/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krak3n/subscriptions","organizations_url":"https://api.github.com/users/krak3n/orgs","repos_url":"https://api.github.com/users/krak3n/repos","events_url":"https://api.github.com/users/krak3n/events{/privacy}","received_events_url":"https://api.github.com/users/krak3n/received_events","type":"User","site_admin":false},"body":"This PR implements the ability for known external clients, such as Soundwave to be able to use the API without the need for authentication as described in #60.\r\n\r\nThis uses a HMAC method where the client sends the request with a base 64 sha256 encrypted signature of the request using a private key. Provided the client and server agree the signature is correct the client is allowed access to the resource.\r\n\r\nExample Request:\r\n\r\n``` http\r\nGET / HTTP/1.1\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate\r\nAuthorization: HMAC client:fyKWDhnOjSnVyFZmfEEzwZM5/v4nWebca33eCYuLX9Q=\r\nConnection: keep-alive\r\n```\r\n\r\nThe `Authorization` header contains the HMAC identifier with the credentials being the client name and the signed request signature.\r\n\r\nThis will allow us to create external client specific resources and allow us to bypass the redis pubsub system in the long run.","created_at":"2015-07-31T22:37:53Z","updated_at":"2015-08-03T16:50:22Z","closed_at":"2015-08-03T16:50:22Z","merged_at":"2015-08-03T16:50:22Z","merge_commit_sha":"9bb57a140bfe39cdcebc342d3c4b9b61ac272f4a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/thisissoon/FM-API/pulls/65/commits","review_comments_url":"https://api.github.com/repos/thisissoon/FM-API/pulls/65/comments","review_comment_url":"https://api.github.com/repos/thisissoon/FM-API/pulls/comments{/number}","comments_url":"https://api.github.com/repos/thisissoon/FM-API/issues/65/comments","statuses_url":"https://api.github.com/repos/thisissoon/FM-API/statuses/5477aaf95299d5c96d7310a6b8cc63d35369f022","head":{"label":"thisissoon:feature/allow-known-clients","ref":"feature/allow-known-clients","sha":"5477aaf95299d5c96d7310a6b8cc63d35369f022","user":{"login":"thisissoon","id":6976199,"avatar_url":"https://avatars.githubusercontent.com/u/6976199?v=3","gravatar_id":"","url":"https://api.github.com/users/thisissoon","html_url":"https://github.com/thisissoon","followers_url":"https://api.github.com/users/thisissoon/followers","following_url":"https://api.github.com/users/thisissoon/following{/other_user}","gists_url":"https://api.github.com/users/thisissoon/gists{/gist_id}","starred_url":"https://api.github.com/users/thisissoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thisissoon/subscriptions","organizations_url":"https://api.github.com/users/thisissoon/orgs","repos_url":"https://api.github.com/users/thisissoon/repos","events_url":"https://api.github.com/users/thisissoon/events{/privacy}","received_events_url":"https://api.github.com/users/thisissoon/received_events","type":"Organization","site_admin":false},"repo":{"id":31375769,"name":"FM-API","full_name":"thisissoon/FM-API","owner":{"login":"thisissoon","id":6976199,"avatar_url":"https://avatars.githubusercontent.com/u/6976199?v=3","gravatar_id":"","url":"https://api.github.com/users/thisissoon","html_url":"https://github.com/thisissoon","followers_url":"https://api.github.com/users/thisissoon/followers","following_url":"https://api.github.com/users/thisissoon/following{/other_user}","gists_url":"https://api.github.com/users/thisissoon/gists{/gist_id}","starred_url":"https://api.github.com/users/thisissoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thisissoon/subscriptions","organizations_url":"https://api.github.com/users/thisissoon/orgs","repos_url":"https://api.github.com/users/thisissoon/repos","events_url":"https://api.github.com/users/thisissoon/events{/privacy}","received_events_url":"https://api.github.com/users/thisissoon/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/thisissoon/FM-API","description":"Simple Flask API Interface to the physical FM Player via Redis Pub Sub","fork":false,"url":"https://api.github.com/repos/thisissoon/FM-API","forks_url":"https://api.github.com/repos/thisissoon/FM-API/forks","keys_url":"https://api.github.com/repos/thisissoon/FM-API/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thisissoon/FM-API/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thisissoon/FM-API/teams","hooks_url":"https://api.github.com/repos/thisissoon/FM-API/hooks","issue_events_url":"https://api.github.com/repos/thisissoon/FM-API/issues/events{/number}","events_url":"https://api.github.com/repos/thisissoon/FM-API/events","assignees_url":"https://api.github.com/repos/thisissoon/FM-API/assignees{/user}","branches_url":"https://api.github.com/repos/thisissoon/FM-API/branches{/branch}","tags_url":"https://api.github.com/repos/thisissoon/FM-API/tags","blobs_url":"https://api.github.com/repos/thisissoon/FM-API/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thisissoon/FM-API/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thisissoon/FM-API/git/refs{/sha}","trees_url":"https://api.github.com/repos/thisissoon/FM-API/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thisissoon/FM-API/statuses/{sha}","languages_url":"https://api.github.com/repos/thisissoon/FM-API/languages","stargazers_url":"https://api.github.com/repos/thisissoon/FM-API/stargazers","contributors_url":"https://api.github.com/repos/thisissoon/FM-API/contributors","subscribers_url":"https://api.github.com/repos/thisissoon/FM-API/subscribers","subscription_url":"https://api.github.com/repos/thisissoon/FM-API/subscription","commits_url":"https://api.github.com/repos/thisissoon/FM-API/commits{/sha}","git_commits_url":"https://api.github.com/repos/thisissoon/FM-API/git/commits{/sha}","comments_url":"https://api.github.com/repos/thisissoon/FM-API/comments{/number}","issue_comment_url":"https://api.github.com/repos/thisissoon/FM-API/issues/comments{/number}","contents_url":"https://api.github.com/repos/thisissoon/FM-API/contents/{+path}","compare_url":"https://api.github.com/repos/thisissoon/FM-API/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thisissoon/FM-API/merges","archive_url":"https://api.github.com/repos/thisissoon/FM-API/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thisissoon/FM-API/downloads","issues_url":"https://api.github.com/repos/thisissoon/FM-API/issues{/number}","pulls_url":"https://api.github.com/repos/thisissoon/FM-API/pulls{/number}","milestones_url":"https://api.github.com/repos/thisissoon/FM-API/milestones{/number}","notifications_url":"https://api.github.com/repos/thisissoon/FM-API/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thisissoon/FM-API/labels{/name}","releases_url":"https://api.github.com/repos/thisissoon/FM-API/releases{/id}","created_at":"2015-02-26T16:15:02Z","updated_at":"2015-06-17T10:36:56Z","pushed_at":"2015-08-03T16:50:22Z","git_url":"git://github.com/thisissoon/FM-API.git","ssh_url":"git@github.com:thisissoon/FM-API.git","clone_url":"https://github.com/thisissoon/FM-API.git","svn_url":"https://github.com/thisissoon/FM-API","homepage":null,"size":1352,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":8,"forks":0,"open_issues":8,"watchers":2,"default_branch":"develop"}},"base":{"label":"thisissoon:develop","ref":"develop","sha":"96f0412156f4613cee9be6d1f49639a7137c7bec","user":{"login":"thisissoon","id":6976199,"avatar_url":"https://avatars.githubusercontent.com/u/6976199?v=3","gravatar_id":"","url":"https://api.github.com/users/thisissoon","html_url":"https://github.com/thisissoon","followers_url":"https://api.github.com/users/thisissoon/followers","following_url":"https://api.github.com/users/thisissoon/following{/other_user}","gists_url":"https://api.github.com/users/thisissoon/gists{/gist_id}","starred_url":"https://api.github.com/users/thisissoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thisissoon/subscriptions","organizations_url":"https://api.github.com/users/thisissoon/orgs","repos_url":"https://api.github.com/users/thisissoon/repos","events_url":"https://api.github.com/users/thisissoon/events{/privacy}","received_events_url":"https://api.github.com/users/thisissoon/received_events","type":"Organization","site_admin":false},"repo":{"id":31375769,"name":"FM-API","full_name":"thisissoon/FM-API","owner":{"login":"thisissoon","id":6976199,"avatar_url":"https://avatars.githubusercontent.com/u/6976199?v=3","gravatar_id":"","url":"https://api.github.com/users/thisissoon","html_url":"https://github.com/thisissoon","followers_url":"https://api.github.com/users/thisissoon/followers","following_url":"https://api.github.com/users/thisissoon/following{/other_user}","gists_url":"https://api.github.com/users/thisissoon/gists{/gist_id}","starred_url":"https://api.github.com/users/thisissoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thisissoon/subscriptions","organizations_url":"https://api.github.com/users/thisissoon/orgs","repos_url":"https://api.github.com/users/thisissoon/repos","events_url":"https://api.github.com/users/thisissoon/events{/privacy}","received_events_url":"https://api.github.com/users/thisissoon/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/thisissoon/FM-API","description":"Simple Flask API Interface to the physical FM Player via Redis Pub Sub","fork":false,"url":"https://api.github.com/repos/thisissoon/FM-API","forks_url":"https://api.github.com/repos/thisissoon/FM-API/forks","keys_url":"https://api.github.com/repos/thisissoon/FM-API/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thisissoon/FM-API/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thisissoon/FM-API/teams","hooks_url":"https://api.github.com/repos/thisissoon/FM-API/hooks","issue_events_url":"https://api.github.com/repos/thisissoon/FM-API/issues/events{/number}","events_url":"https://api.github.com/repos/thisissoon/FM-API/events","assignees_url":"https://api.github.com/repos/thisissoon/FM-API/assignees{/user}","branches_url":"https://api.github.com/repos/thisissoon/FM-API/branches{/branch}","tags_url":"https://api.github.com/repos/thisissoon/FM-API/tags","blobs_url":"https://api.github.com/repos/thisissoon/FM-API/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thisissoon/FM-API/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thisissoon/FM-API/git/refs{/sha}","trees_url":"https://api.github.com/repos/thisissoon/FM-API/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thisissoon/FM-API/statuses/{sha}","languages_url":"https://api.github.com/repos/thisissoon/FM-API/languages","stargazers_url":"https://api.github.com/repos/thisissoon/FM-API/stargazers","contributors_url":"https://api.github.com/repos/thisissoon/FM-API/contributors","subscribers_url":"https://api.github.com/repos/thisissoon/FM-API/subscribers","subscription_url":"https://api.github.com/repos/thisissoon/FM-API/subscription","commits_url":"https://api.github.com/repos/thisissoon/FM-API/commits{/sha}","git_commits_url":"https://api.github.com/repos/thisissoon/FM-API/git/commits{/sha}","comments_url":"https://api.github.com/repos/thisissoon/FM-API/comments{/number}","issue_comment_url":"https://api.github.com/repos/thisissoon/FM-API/issues/comments{/number}","contents_url":"https://api.github.com/repos/thisissoon/FM-API/contents/{+path}","compare_url":"https://api.github.com/repos/thisissoon/FM-API/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thisissoon/FM-API/merges","archive_url":"https://api.github.com/repos/thisissoon/FM-API/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thisissoon/FM-API/downloads","issues_url":"https://api.github.com/repos/thisissoon/FM-API/issues{/number}","pulls_url":"https://api.github.com/repos/thisissoon/FM-API/pulls{/number}","milestones_url":"https://api.github.com/repos/thisissoon/FM-API/milestones{/number}","notifications_url":"https://api.github.com/repos/thisissoon/FM-API/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thisissoon/FM-API/labels{/name}","releases_url":"https://api.github.com/repos/thisissoon/FM-API/releases{/id}","created_at":"2015-02-26T16:15:02Z","updated_at":"2015-06-17T10:36:56Z","pushed_at":"2015-08-03T16:50:22Z","git_url":"git://github.com/thisissoon/FM-API.git","ssh_url":"git@github.com:thisissoon/FM-API.git","clone_url":"https://github.com/thisissoon/FM-API.git","svn_url":"https://github.com/thisissoon/FM-API","homepage":null,"size":1352,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":8,"forks":0,"open_issues":8,"watchers":2,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/thisissoon/FM-API/pulls/65"},"html":{"href":"https://github.com/thisissoon/FM-API/pull/65"},"issue":{"href":"https://api.github.com/repos/thisissoon/FM-API/issues/65"},"comments":{"href":"https://api.github.com/repos/thisissoon/FM-API/issues/65/comments"},"review_comments":{"href":"https://api.github.com/repos/thisissoon/FM-API/pulls/65/comments"},"review_comment":{"href":"https://api.github.com/repos/thisissoon/FM-API/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/thisissoon/FM-API/pulls/65/commits"},"statuses":{"href":"https://api.github.com/repos/thisissoon/FM-API/statuses/5477aaf95299d5c96d7310a6b8cc63d35369f022"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"krak3n","id":112322,"avatar_url":"https://avatars.githubusercontent.com/u/112322?v=3","gravatar_id":"","url":"https://api.github.com/users/krak3n","html_url":"https://github.com/krak3n","followers_url":"https://api.github.com/users/krak3n/followers","following_url":"https://api.github.com/users/krak3n/following{/other_user}","gists_url":"https://api.github.com/users/krak3n/gists{/gist_id}","starred_url":"https://api.github.com/users/krak3n/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krak3n/subscriptions","organizations_url":"https://api.github.com/users/krak3n/orgs","repos_url":"https://api.github.com/users/krak3n/repos","events_url":"https://api.github.com/users/krak3n/events{/privacy}","received_events_url":"https://api.github.com/users/krak3n/received_events","type":"User","site_admin":false},"comments":4,"review_comments":0,"commits":16,"additions":409,"deletions":10,"changed_files":10}}