{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/comments/81864419","pull_request_review_id":2812317,"id":81864419,"diff_hunk":"@@ -0,0 +1,233 @@\n+# Copyright 2016 Google Inc.\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+#      http://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+\"\"\"JSON Web Tokens\n+\n+Provides support for creating (encoding) and verifying (decoding) JWTs,\n+especially JWTs generated and consumed by Google infrastructure.\n+\n+See `rfc7519`_ for more details on JWTs.\n+\n+To encode a JWT::\n+\n+    from google.auth import crypto\n+    from google.auth import jwt\n+\n+    signer = crypt.Signer(private_key)\n+    payload = {'some': 'payload'}\n+    encoded = jwt.encode(signer, payload)\n+\n+To decode a JWT and verify claims::\n+\n+    claims = jwt.decode(encoded, certs=public_certs)\n+\n+You can also skip verification::\n+\n+    claims = jwt.decode(encoded, verify=False)\n+\n+.. _rfc7519: https://tools.ietf.org/html/rfc7519\n+\n+\"\"\"\n+\n+import base64\n+import collections\n+import json\n+\n+from google.auth import crypt\n+from google.auth import _helpers\n+\n+\n+_DEFAULT_TOKEN_LIFETIME_SECS = 3600  # 1 hour in sections\n+CLOCK_SKEW_SECS = 300  # 5 minutes in seconds\n+\n+\n+def encode(signer, payload, header=None, key_id=None):\n+    \"\"\"Make a signed JWT.\n+\n+    Args:\n+        signer (google.auth.crypt.Signer): The signer used to sign the JWT.\n+        payload (Mapping): The JWT payload.\n+        header (Mapping): Additional JWT header payload.\n+        key_id (str): The key id to add to the JWT header. If the\n+            signer has a key id it will be used as the default. If this is\n+            specified, it'll override the signer's key id.\n+\n+    Returns:\n+        bytes: The encoded JWT.\n+    \"\"\"\n+    if not header:\n+        header = {}\n+\n+    if key_id is None:\n+        key_id = signer.key_id\n+\n+    header.update({'typ': 'JWT', 'alg': 'RS256'})\n+\n+    if key_id is not None and key_id is not False:\n+        header['kid'] = key_id\n+\n+    segments = [\n+        base64.urlsafe_b64encode(json.dumps(header).encode('utf-8')),\n+        base64.urlsafe_b64encode(json.dumps(payload).encode('utf-8')),\n+    ]\n+\n+    signing_input = b'.'.join(segments)\n+    signature = signer.sign(signing_input)\n+    segments.append(base64.urlsafe_b64encode(signature))\n+\n+    return b'.'.join(segments)\n+\n+\n+def _decode_jwt_segment(encoded_section):\n+    \"\"\"Decodes a single JWT segment.\"\"\"\n+    section_bytes = base64.urlsafe_b64decode(encoded_section)\n+    try:\n+        return json.loads(section_bytes.decode('utf-8'))\n+    except:\n+        raise ValueError('Can\\'t parse segment: {0}'.format(section_bytes))\n+\n+\n+def _unverified_decode(token):\n+    \"\"\"Decodes a token and does no verification.\n+\n+    Args:\n+        token (Union[str, bytes]): The encoded JWT.\n+\n+    Returns:\n+        Tuple(str, str, str, str): header, payload, signed_setion, and\n+            signature.\n+\n+    Raises:\n+        ValueError: if there are an incorrect amount of segments in the token.\n+    \"\"\"\n+    token = _helpers.to_bytes(token)\n+\n+    if token.count(b'.') != 2:\n+        raise ValueError(\n+            'Wrong number of segments in token: {0}'.format(token))\n+\n+    encoded_header, encoded_payload, signature = token.split(b'.')\n+    signed_section = encoded_header + b'.' + encoded_payload\n+    signature = base64.urlsafe_b64decode(signature)\n+\n+    # Parse segments\n+    header = _decode_jwt_segment(encoded_header)\n+    payload = _decode_jwt_segment(encoded_payload)\n+\n+    return header, payload, signed_section, signature\n+\n+\n+def decode_header(token):\n+    \"\"\"Return the decoded header of a token.\n+\n+    No verification is done. This is useful to extract the key id from\n+    the header in order to acquire the appropriate certificate to verify\n+    the token.\n+\n+    Args:\n+        token (Union[str, bytes]): the encoded JWT.\n+\n+    Returns:\n+        Mapping: The decoded JWT header.\n+    \"\"\"\n+    header, _, _, _ = _unverified_decode(token)\n+    return header\n+\n+\n+def _verify_iat_and_exp(payload):\n+    \"\"\"Verifies the iat (Issued At) and exp (Expires) claims in a token\n+    payload.\n+\n+    Args:\n+        payload (mapping): The JWT payload.\n+\n+    Raises:\n+        ValueError: if any checks failed.\n+    \"\"\"\n+    now = _helpers.datetime_to_secs(_helpers.now())\n+\n+    # Make sure the iat and exp claims are present\n+    for key in ('iat', 'exp'):\n+        if key not in payload:\n+            raise ValueError(\n+                'Token does not contain required claim {}'.format(key))\n+\n+    # Make sure the token wasn't issued in the future\n+    iat = payload['iat']\n+    earliest = iat - CLOCK_SKEW_SECS\n+    if now < earliest:\n+        raise ValueError('Token used too early, {} < {}'.format(now, iat))\n+\n+    # Make sure the token wasn't issue in the past\n+    exp = payload['exp']\n+    latest = exp + CLOCK_SKEW_SECS\n+    if latest < now:\n+        raise ValueError('Token expired, {} < {}'.format(latest, now))\n+\n+\n+def decode(token, certs=None, verify=True, audience=None):\n+    \"\"\"Decode and verify a JWT.\n+\n+    Args:\n+        token (string): The encoded JWT.\n+        certs (Union[str, bytes, Mapping]): The certificate used to\n+            validate. If bytes or string, it must the the public key\n+            certificate in PEM format. If a mapping, it must be a mapping of\n+            key IDs to public key certificates in PEM format. The mapping must\n+            contain the same key ID that's specified in the token's header.\n+        verify (bool): Whether to perform signature and claim validation.\n+            Verification is done by default.\n+        audience (str): The audience claim, 'aud', that this JWT should\n+            contain. If None then the JWT's 'aud' parameter is not verified.\n+\n+    Returns:\n+        Mapping: The deserialized JSON payload in the JWT.\n+\n+    Raises:\n+        ValueError: if any verification checks failed.\n+    \"\"\"\n+    header, payload, signed_section, signature = _unverified_decode(token)\n+\n+    if not verify:\n+        return payload\n+\n+    # If certs is specified as a dictionary of key IDs to certificates, then\n+    # use the certificate identified by the key ID in the token header.\n+    if isinstance(certs, collections.Mapping):\n+        key_id = header.get('kid')\n+        if key_id:\n+            if key_id not in certs:\n+                raise ValueError(\n+                    'Certificate for key id {} not found.'.format(key_id))\n+            certs = [certs[key_id]]\n+        # If there's no key id in the header, check against all of the certs.\n+        else:\n+            certs = certs.values()","path":"google/auth/jwt.py","position":216,"original_position":216,"commit_id":"d1d8232bcc56ff593eb3c46b584028efd756569f","original_commit_id":"d1d8232bcc56ff593eb3c46b584028efd756569f","user":{"login":"dhermes","id":520669,"avatar_url":"https://avatars.githubusercontent.com/u/520669?v=3","gravatar_id":"","url":"https://api.github.com/users/dhermes","html_url":"https://github.com/dhermes","followers_url":"https://api.github.com/users/dhermes/followers","following_url":"https://api.github.com/users/dhermes/following{/other_user}","gists_url":"https://api.github.com/users/dhermes/gists{/gist_id}","starred_url":"https://api.github.com/users/dhermes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dhermes/subscriptions","organizations_url":"https://api.github.com/users/dhermes/orgs","repos_url":"https://api.github.com/users/dhermes/repos","events_url":"https://api.github.com/users/dhermes/events{/privacy}","received_events_url":"https://api.github.com/users/dhermes/received_events","type":"User","site_admin":false},"body":"Both `certs = certs.values()` and `certs = [certs[key_id]]` are strange. Can you use a different name for the LHS variable? `cert_vals`?","created_at":"2016-10-04T22:06:01Z","updated_at":"2016-10-04T22:08:07Z","html_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python/pull/7#discussion_r81864419","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/comments/81864419"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-auth-library-python/pull/7#discussion_r81864419"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7","id":87977891,"html_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python/pull/7","diff_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python/pull/7.diff","patch_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python/pull/7.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/7","number":7,"state":"open","locked":false,"title":"Add google.auth.jwt","user":{"login":"jonparrott","id":250995,"avatar_url":"https://avatars.githubusercontent.com/u/250995?v=3","gravatar_id":"","url":"https://api.github.com/users/jonparrott","html_url":"https://github.com/jonparrott","followers_url":"https://api.github.com/users/jonparrott/followers","following_url":"https://api.github.com/users/jonparrott/following{/other_user}","gists_url":"https://api.github.com/users/jonparrott/gists{/gist_id}","starred_url":"https://api.github.com/users/jonparrott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonparrott/subscriptions","organizations_url":"https://api.github.com/users/jonparrott/orgs","repos_url":"https://api.github.com/users/jonparrott/repos","events_url":"https://api.github.com/users/jonparrott/events{/privacy}","received_events_url":"https://api.github.com/users/jonparrott/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-10-04T21:28:33Z","updated_at":"2016-10-04T22:08:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ab23dd8ad45c3775e7c8402518f4e64dfcd4c592","assignee":{"login":"bjwatson","id":471755,"avatar_url":"https://avatars.githubusercontent.com/u/471755?v=3","gravatar_id":"","url":"https://api.github.com/users/bjwatson","html_url":"https://github.com/bjwatson","followers_url":"https://api.github.com/users/bjwatson/followers","following_url":"https://api.github.com/users/bjwatson/following{/other_user}","gists_url":"https://api.github.com/users/bjwatson/gists{/gist_id}","starred_url":"https://api.github.com/users/bjwatson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bjwatson/subscriptions","organizations_url":"https://api.github.com/users/bjwatson/orgs","repos_url":"https://api.github.com/users/bjwatson/repos","events_url":"https://api.github.com/users/bjwatson/events{/privacy}","received_events_url":"https://api.github.com/users/bjwatson/received_events","type":"User","site_admin":false},"assignees":[{"login":"bjwatson","id":471755,"avatar_url":"https://avatars.githubusercontent.com/u/471755?v=3","gravatar_id":"","url":"https://api.github.com/users/bjwatson","html_url":"https://github.com/bjwatson","followers_url":"https://api.github.com/users/bjwatson/followers","following_url":"https://api.github.com/users/bjwatson/following{/other_user}","gists_url":"https://api.github.com/users/bjwatson/gists{/gist_id}","starred_url":"https://api.github.com/users/bjwatson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bjwatson/subscriptions","organizations_url":"https://api.github.com/users/bjwatson/orgs","repos_url":"https://api.github.com/users/bjwatson/repos","events_url":"https://api.github.com/users/bjwatson/events{/privacy}","received_events_url":"https://api.github.com/users/bjwatson/received_events","type":"User","site_admin":false},{"login":"dhermes","id":520669,"avatar_url":"https://avatars.githubusercontent.com/u/520669?v=3","gravatar_id":"","url":"https://api.github.com/users/dhermes","html_url":"https://github.com/dhermes","followers_url":"https://api.github.com/users/dhermes/followers","following_url":"https://api.github.com/users/dhermes/following{/other_user}","gists_url":"https://api.github.com/users/dhermes/gists{/gist_id}","starred_url":"https://api.github.com/users/dhermes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dhermes/subscriptions","organizations_url":"https://api.github.com/users/dhermes/orgs","repos_url":"https://api.github.com/users/dhermes/repos","events_url":"https://api.github.com/users/dhermes/events{/privacy}","received_events_url":"https://api.github.com/users/dhermes/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/milestones/1","html_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python/milestones/1.0.0","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/milestones/1/labels","id":2045235,"number":1,"title":"1.0.0","description":"","creator":{"login":"jonparrott","id":250995,"avatar_url":"https://avatars.githubusercontent.com/u/250995?v=3","gravatar_id":"","url":"https://api.github.com/users/jonparrott","html_url":"https://github.com/jonparrott","followers_url":"https://api.github.com/users/jonparrott/followers","following_url":"https://api.github.com/users/jonparrott/following{/other_user}","gists_url":"https://api.github.com/users/jonparrott/gists{/gist_id}","starred_url":"https://api.github.com/users/jonparrott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonparrott/subscriptions","organizations_url":"https://api.github.com/users/jonparrott/orgs","repos_url":"https://api.github.com/users/jonparrott/repos","events_url":"https://api.github.com/users/jonparrott/events{/privacy}","received_events_url":"https://api.github.com/users/jonparrott/received_events","type":"User","site_admin":false},"open_issues":3,"closed_issues":2,"state":"open","created_at":"2016-10-03T20:50:32Z","updated_at":"2016-10-04T21:45:50Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/7/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/statuses/d1d8232bcc56ff593eb3c46b584028efd756569f","head":{"label":"GoogleCloudPlatform:jwt","ref":"jwt","sha":"d1d8232bcc56ff593eb3c46b584028efd756569f","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":69199387,"name":"google-auth-library-python","full_name":"GoogleCloudPlatform/google-auth-library-python","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python","description":"Google Auth Python Library (Experimental)","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/deployments","created_at":"2016-09-26T00:38:59Z","updated_at":"2016-10-04T17:20:37Z","pushed_at":"2016-10-04T21:51:18Z","git_url":"git://github.com/GoogleCloudPlatform/google-auth-library-python.git","ssh_url":"git@github.com:GoogleCloudPlatform/google-auth-library-python.git","clone_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python.git","svn_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python","homepage":null,"size":194,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"8713a715089ba188c6134c8aa6a3d82693c4deb6","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":69199387,"name":"google-auth-library-python","full_name":"GoogleCloudPlatform/google-auth-library-python","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python","description":"Google Auth Python Library (Experimental)","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/deployments","created_at":"2016-09-26T00:38:59Z","updated_at":"2016-10-04T17:20:37Z","pushed_at":"2016-10-04T21:51:18Z","git_url":"git://github.com/GoogleCloudPlatform/google-auth-library-python.git","ssh_url":"git@github.com:GoogleCloudPlatform/google-auth-library-python.git","clone_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python.git","svn_url":"https://github.com/GoogleCloudPlatform/google-auth-library-python","homepage":null,"size":194,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-auth-library-python/pull/7"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/7"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/issues/7/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/pulls/7/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-auth-library-python/statuses/d1d8232bcc56ff593eb3c46b584028efd756569f"}}}}
{"actor":{"display_login":"dhermes"}}