{"action":"created","comment":{"url":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments/294360392","pull_request_review_id":250575242,"id":294360392,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI5NDM2MDM5Mg==","diff_hunk":"@@ -0,0 +1,272 @@\n+/*\n+ * Copyright 2002-2019 the original author or authors.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *      https://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package org.springframework.security.oauth2.client;\n+\n+import org.springframework.lang.Nullable;\n+import org.springframework.security.core.Authentication;\n+import org.springframework.security.core.GrantedAuthority;\n+import org.springframework.security.oauth2.client.registration.ClientRegistration;\n+import org.springframework.util.Assert;\n+import org.springframework.util.CollectionUtils;\n+\n+import java.util.Collection;\n+import java.util.Collections;\n+import java.util.HashMap;\n+import java.util.LinkedHashMap;\n+import java.util.Map;\n+\n+/**\n+ * A context that holds authorization-specific state and is used by an {@link OAuth2AuthorizedClientProvider}\n+ * when attempting to authorize (or re-authorize) an OAuth 2.0 Client.\n+ *\n+ * @author Joe Grandja\n+ * @since 5.2\n+ * @see OAuth2AuthorizedClientProvider\n+ */\n+public final class OAuth2AuthorizationContext {\n+\tprivate ClientRegistration clientRegistration;\n+\tprivate Authentication principal;\n+\tprivate OAuth2AuthorizedClient authorizedClient;\n+\tprivate Map<String, Object> attributes;\n+\n+\tprivate OAuth2AuthorizationContext() {\n+\t}\n+\n+\t/**\n+\t * Returns the {@link ClientRegistration client} requiring authorization.\n+\t *\n+\t * @return the {@link ClientRegistration}\n+\t */\n+\tpublic ClientRegistration getClientRegistration() {\n+\t\treturn this.clientRegistration;\n+\t}\n+\n+\t/**\n+\t * Returns the {@code Principal} to be associated with the authorized client.\n+\t *\n+\t * @return the {@code Principal} to be associated with the authorized client\n+\t */\n+\tpublic Authentication getPrincipal() {\n+\t\treturn this.principal;\n+\t}\n+\n+\t/**\n+\t * Returns the {@link OAuth2AuthorizedClient authorized client} which requires re-authorization\n+\t * or {@code null} if the {@link #getClientRegistration() client} needs to be authorized.\n+\t *\n+\t * @return the {@link OAuth2AuthorizedClient} which requires re-authorization or {@code null} if the client needs to be authorized\n+\t */\n+\t@Nullable\n+\tpublic OAuth2AuthorizedClient getAuthorizedClient() {\n+\t\treturn this.authorizedClient;\n+\t}\n+\n+\t/**\n+\t * Returns the attributes associated to the context.\n+\t *\n+\t * @return a {@code Map} of the attributes associated to the context\n+\t */\n+\tpublic Map<String, Object> getAttributes() {\n+\t\treturn this.attributes;\n+\t}\n+\n+\t/**\n+\t * Returns the value of an attribute associated to the context, or {@code null} if not available.\n+\t *\n+\t * @param name the name of the attribute\n+\t * @param <T> the type of the attribute\n+\t * @return the value of the attribute associated to the context\n+\t */\n+\t@Nullable\n+\t@SuppressWarnings(\"unchecked\")\n+\tpublic <T> T getAttribute(String name) {\n+\t\treturn (T) this.getAttributes().get(name);\n+\t}\n+\n+\t/**\n+\t * Returns {@code true} if the client needs to be authorized, otherwise {@code false}.\n+\t *\n+\t * @return {@code true} if the client needs to be authorized, otherwise {@code false}.\n+\t */\n+\tpublic boolean authorizationRequired() {\n+\t\treturn getAuthorizedClient() == null;\n+\t}\n+\n+\t/**\n+\t * Returns {@code true} if the client needs to be re-authorized, otherwise {@code false}.\n+\t *\n+\t * @return {@code true} if the client needs to be re-authorized, otherwise {@code false}.\n+\t */\n+\tpublic boolean reauthorizationRequired() {\n+\t\treturn getAuthorizedClient() != null;","path":"oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/OAuth2AuthorizationContext.java","position":114,"original_position":114,"commit_id":"eef15bc6980c49df499b910af4759b46fab69944","original_commit_id":"eef15bc6980c49df499b910af4759b46fab69944","user":{"login":"jzheaux","id":3627351,"node_id":"MDQ6VXNlcjM2MjczNTE=","avatar_url":"https://avatars0.githubusercontent.com/u/3627351?v=4","gravatar_id":"","url":"https://api.github.com/users/jzheaux","html_url":"https://github.com/jzheaux","followers_url":"https://api.github.com/users/jzheaux/followers","following_url":"https://api.github.com/users/jzheaux/following{/other_user}","gists_url":"https://api.github.com/users/jzheaux/gists{/gist_id}","starred_url":"https://api.github.com/users/jzheaux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jzheaux/subscriptions","organizations_url":"https://api.github.com/users/jzheaux/orgs","repos_url":"https://api.github.com/users/jzheaux/repos","events_url":"https://api.github.com/users/jzheaux/events{/privacy}","received_events_url":"https://api.github.com/users/jzheaux/received_events","type":"User","site_admin":false},"body":"Can you explain your reasoning a bit here? \"Reauthorization is required if we have an authorized client\" doesn't seem logical.\r\n\r\nActually, given the name, I'd expect logic like what `hasTokenExpired` has.\r\n\r\nWould it make sense to either 1. actually check if reauthorization is indeed required or 2. rename the method to `reauthorizationRequested`? \r\n\r\nIf it's not ideal to place the expiration logic here in the context, then I think that `reauthorizationRequested` aligns better with the application's intent when calling the `reauthorize` static method, i.e. the application doesn't actually care whether reauthorization truly is required, it wants it reauthorized either way.\r\n\r\nI think it would be easy to make this mistake, say if I were building a Zuul filter, or similar:\r\n\r\n```java\r\nOAuth2AuthorizationContext.Builder contextBuilder = reauthorize(authorizedClient);\r\nif (contextBuilder.reauthorizeRequired()) {\r\n    // ... application assumes that this means the token is expired\r\n}\r\n```\r\n","created_at":"2019-06-17T15:36:38Z","updated_at":"2019-06-17T15:59:28Z","html_url":"https://github.com/spring-projects/spring-security/pull/6845#discussion_r294360392","pull_request_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments/294360392"},"html":{"href":"https://github.com/spring-projects/spring-security/pull/6845#discussion_r294360392"},"pull_request":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845"}}},"pull_request":{"url":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845","id":276321092,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjc2MzIxMDky","html_url":"https://github.com/spring-projects/spring-security/pull/6845","diff_url":"https://github.com/spring-projects/spring-security/pull/6845.diff","patch_url":"https://github.com/spring-projects/spring-security/pull/6845.patch","issue_url":"https://api.github.com/repos/spring-projects/spring-security/issues/6845","number":6845,"state":"open","locked":false,"title":"Introduce OAuth2AuthorizedClientProvider","user":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"body":"This PR addresses the Servlet implementation for #6811  - the Reactive implementation will be submitted in a separate PR.\r\n\r\nThe primary responsibility of an implementation of an `OAuth2AuthorizedClientProvider` is to **authorize** (or **re-authorize**) a client. This interface would be implemented by specific grant types, e.g. `authorization_code`, `refresh_token`, `client_credentials`, `password`, custom/extension grants, etc.","created_at":"2019-05-06T20:24:12Z","updated_at":"2019-06-17T15:59:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bdaf4dd2846c06606233d9c3e1d8388f2384330f","assignee":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"assignees":[{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":555556091,"node_id":"MDU6TGFiZWw1NTU1NTYwOTE=","url":"https://api.github.com/repos/spring-projects/spring-security/labels/in:%20oauth2","name":"in: oauth2","color":"e8f9de","default":false},{"id":322225082,"node_id":"MDU6TGFiZWwzMjIyMjUwODI=","url":"https://api.github.com/repos/spring-projects/spring-security/labels/type:%20enhancement","name":"type: enhancement","color":"e3d9fc","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845/commits","review_comments_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845/comments","review_comment_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spring-projects/spring-security/issues/6845/comments","statuses_url":"https://api.github.com/repos/spring-projects/spring-security/statuses/eef15bc6980c49df499b910af4759b46fab69944","head":{"label":"jgrandja:gh-6811-webclient-ext-reuse","ref":"gh-6811-webclient-ext-reuse","sha":"eef15bc6980c49df499b910af4759b46fab69944","user":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"repo":{"id":54121519,"node_id":"MDEwOlJlcG9zaXRvcnk1NDEyMTUxOQ==","name":"spring-security","full_name":"jgrandja/spring-security","private":false,"owner":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"html_url":"https://github.com/jgrandja/spring-security","description":"Spring Security","fork":true,"url":"https://api.github.com/repos/jgrandja/spring-security","forks_url":"https://api.github.com/repos/jgrandja/spring-security/forks","keys_url":"https://api.github.com/repos/jgrandja/spring-security/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jgrandja/spring-security/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jgrandja/spring-security/teams","hooks_url":"https://api.github.com/repos/jgrandja/spring-security/hooks","issue_events_url":"https://api.github.com/repos/jgrandja/spring-security/issues/events{/number}","events_url":"https://api.github.com/repos/jgrandja/spring-security/events","assignees_url":"https://api.github.com/repos/jgrandja/spring-security/assignees{/user}","branches_url":"https://api.github.com/repos/jgrandja/spring-security/branches{/branch}","tags_url":"https://api.github.com/repos/jgrandja/spring-security/tags","blobs_url":"https://api.github.com/repos/jgrandja/spring-security/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jgrandja/spring-security/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jgrandja/spring-security/git/refs{/sha}","trees_url":"https://api.github.com/repos/jgrandja/spring-security/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jgrandja/spring-security/statuses/{sha}","languages_url":"https://api.github.com/repos/jgrandja/spring-security/languages","stargazers_url":"https://api.github.com/repos/jgrandja/spring-security/stargazers","contributors_url":"https://api.github.com/repos/jgrandja/spring-security/contributors","subscribers_url":"https://api.github.com/repos/jgrandja/spring-security/subscribers","subscription_url":"https://api.github.com/repos/jgrandja/spring-security/subscription","commits_url":"https://api.github.com/repos/jgrandja/spring-security/commits{/sha}","git_commits_url":"https://api.github.com/repos/jgrandja/spring-security/git/commits{/sha}","comments_url":"https://api.github.com/repos/jgrandja/spring-security/comments{/number}","issue_comment_url":"https://api.github.com/repos/jgrandja/spring-security/issues/comments{/number}","contents_url":"https://api.github.com/repos/jgrandja/spring-security/contents/{+path}","compare_url":"https://api.github.com/repos/jgrandja/spring-security/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jgrandja/spring-security/merges","archive_url":"https://api.github.com/repos/jgrandja/spring-security/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jgrandja/spring-security/downloads","issues_url":"https://api.github.com/repos/jgrandja/spring-security/issues{/number}","pulls_url":"https://api.github.com/repos/jgrandja/spring-security/pulls{/number}","milestones_url":"https://api.github.com/repos/jgrandja/spring-security/milestones{/number}","notifications_url":"https://api.github.com/repos/jgrandja/spring-security/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jgrandja/spring-security/labels{/name}","releases_url":"https://api.github.com/repos/jgrandja/spring-security/releases{/id}","deployments_url":"https://api.github.com/repos/jgrandja/spring-security/deployments","created_at":"2016-03-17T13:50:21Z","updated_at":"2019-04-26T13:56:31Z","pushed_at":"2019-06-16T01:23:05Z","git_url":"git://github.com/jgrandja/spring-security.git","ssh_url":"git@github.com:jgrandja/spring-security.git","clone_url":"https://github.com/jgrandja/spring-security.git","svn_url":"https://github.com/jgrandja/spring-security","homepage":"http://spring.io/spring-security","size":34572,"stargazers_count":3,"watchers_count":3,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":3,"default_branch":"master"}},"base":{"label":"spring-projects:master","ref":"master","sha":"23a7c3010ce69081acdf04f775adeae2c6592b56","user":{"login":"spring-projects","id":317776,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc3Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/317776?v=4","gravatar_id":"","url":"https://api.github.com/users/spring-projects","html_url":"https://github.com/spring-projects","followers_url":"https://api.github.com/users/spring-projects/followers","following_url":"https://api.github.com/users/spring-projects/following{/other_user}","gists_url":"https://api.github.com/users/spring-projects/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-projects/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-projects/subscriptions","organizations_url":"https://api.github.com/users/spring-projects/orgs","repos_url":"https://api.github.com/users/spring-projects/repos","events_url":"https://api.github.com/users/spring-projects/events{/privacy}","received_events_url":"https://api.github.com/users/spring-projects/received_events","type":"Organization","site_admin":false},"repo":{"id":3148979,"node_id":"MDEwOlJlcG9zaXRvcnkzMTQ4OTc5","name":"spring-security","full_name":"spring-projects/spring-security","private":false,"owner":{"login":"spring-projects","id":317776,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc3Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/317776?v=4","gravatar_id":"","url":"https://api.github.com/users/spring-projects","html_url":"https://github.com/spring-projects","followers_url":"https://api.github.com/users/spring-projects/followers","following_url":"https://api.github.com/users/spring-projects/following{/other_user}","gists_url":"https://api.github.com/users/spring-projects/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-projects/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-projects/subscriptions","organizations_url":"https://api.github.com/users/spring-projects/orgs","repos_url":"https://api.github.com/users/spring-projects/repos","events_url":"https://api.github.com/users/spring-projects/events{/privacy}","received_events_url":"https://api.github.com/users/spring-projects/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/spring-projects/spring-security","description":"Spring Security","fork":false,"url":"https://api.github.com/repos/spring-projects/spring-security","forks_url":"https://api.github.com/repos/spring-projects/spring-security/forks","keys_url":"https://api.github.com/repos/spring-projects/spring-security/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spring-projects/spring-security/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spring-projects/spring-security/teams","hooks_url":"https://api.github.com/repos/spring-projects/spring-security/hooks","issue_events_url":"https://api.github.com/repos/spring-projects/spring-security/issues/events{/number}","events_url":"https://api.github.com/repos/spring-projects/spring-security/events","assignees_url":"https://api.github.com/repos/spring-projects/spring-security/assignees{/user}","branches_url":"https://api.github.com/repos/spring-projects/spring-security/branches{/branch}","tags_url":"https://api.github.com/repos/spring-projects/spring-security/tags","blobs_url":"https://api.github.com/repos/spring-projects/spring-security/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spring-projects/spring-security/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spring-projects/spring-security/git/refs{/sha}","trees_url":"https://api.github.com/repos/spring-projects/spring-security/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spring-projects/spring-security/statuses/{sha}","languages_url":"https://api.github.com/repos/spring-projects/spring-security/languages","stargazers_url":"https://api.github.com/repos/spring-projects/spring-security/stargazers","contributors_url":"https://api.github.com/repos/spring-projects/spring-security/contributors","subscribers_url":"https://api.github.com/repos/spring-projects/spring-security/subscribers","subscription_url":"https://api.github.com/repos/spring-projects/spring-security/subscription","commits_url":"https://api.github.com/repos/spring-projects/spring-security/commits{/sha}","git_commits_url":"https://api.github.com/repos/spring-projects/spring-security/git/commits{/sha}","comments_url":"https://api.github.com/repos/spring-projects/spring-security/comments{/number}","issue_comment_url":"https://api.github.com/repos/spring-projects/spring-security/issues/comments{/number}","contents_url":"https://api.github.com/repos/spring-projects/spring-security/contents/{+path}","compare_url":"https://api.github.com/repos/spring-projects/spring-security/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spring-projects/spring-security/merges","archive_url":"https://api.github.com/repos/spring-projects/spring-security/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spring-projects/spring-security/downloads","issues_url":"https://api.github.com/repos/spring-projects/spring-security/issues{/number}","pulls_url":"https://api.github.com/repos/spring-projects/spring-security/pulls{/number}","milestones_url":"https://api.github.com/repos/spring-projects/spring-security/milestones{/number}","notifications_url":"https://api.github.com/repos/spring-projects/spring-security/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spring-projects/spring-security/labels{/name}","releases_url":"https://api.github.com/repos/spring-projects/spring-security/releases{/id}","deployments_url":"https://api.github.com/repos/spring-projects/spring-security/deployments","created_at":"2012-01-10T21:50:57Z","updated_at":"2019-06-17T08:53:33Z","pushed_at":"2019-06-17T14:51:31Z","git_url":"git://github.com/spring-projects/spring-security.git","ssh_url":"git@github.com:spring-projects/spring-security.git","clone_url":"https://github.com/spring-projects/spring-security.git","svn_url":"https://github.com/spring-projects/spring-security","homepage":"http://spring.io/spring-security","size":36818,"stargazers_count":3552,"watchers_count":3552,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3168,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":946,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":3168,"open_issues":946,"watchers":3552,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845"},"html":{"href":"https://github.com/spring-projects/spring-security/pull/6845"},"issue":{"href":"https://api.github.com/repos/spring-projects/spring-security/issues/6845"},"comments":{"href":"https://api.github.com/repos/spring-projects/spring-security/issues/6845/comments"},"review_comments":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845/comments"},"review_comment":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/6845/commits"},"statuses":{"href":"https://api.github.com/repos/spring-projects/spring-security/statuses/eef15bc6980c49df499b910af4759b46fab69944"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"jzheaux"}}