Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Rename from PyVEP to PyBrowserID

  • Loading branch information...
commit 3f85301363658f86050155bfb79e779a135fd2d1 1 parent bb778f0
Ryan Kelly rfk authored
Showing with 155 additions and 157 deletions.
  1. +4 −3 CHANGES.txt
  2. +1 −1  MANIFEST.in
  3. +7 −12 README.rst
  4. +43 −0 browserid/__init__.py
  5. 0  {vep → browserid}/_m2_monkeypatch.py
  6. +15 −15 {vep → browserid}/certificates.py
  7. +5 −5 {vep → browserid}/errors.py
  8. +5 −4 {vep → browserid}/jwt.py
  9. 0  {vep/verifiers → browserid/tests}/__init__.py
  10. +1 −1  {vep → browserid}/tests/certs/README.txt
  11. 0  {vep → browserid}/tests/certs/localhost.crt
  12. 0  {vep → browserid}/tests/certs/localhost.key
  13. 0  {vep → browserid}/tests/certs/selfsigned.crt
  14. 0  {vep → browserid}/tests/certs/selfsigned.key
  15. +8 −8 {vep → browserid}/tests/support.py
  16. +3 −3 {vep → browserid}/tests/test_jwt.py
  17. +2 −2 {vep → browserid}/tests/test_m2_monkeypatch.py
  18. +4 −3 {vep → browserid}/tests/test_utils.py
  19. +19 −19 {vep → browserid}/tests/test_verifiers.py
  20. +5 −5 {vep → browserid}/utils.py
  21. 0  {vep/tests → browserid/verifiers}/__init__.py
  22. +15 −15 {vep → browserid}/verifiers/local.py
  23. +9 −9 {vep → browserid}/verifiers/remote.py
  24. +3 −3 {vep → browserid}/verifiers/workerpool.py
  25. +6 −6 setup.py
  26. +0 −43 vep/__init__.py
7 CHANGES.txt
View
@@ -1,11 +1,12 @@
0.4.0 - ????-??-??
==================
+ * Renamed from PyVEP to PyBrowserID, in keeping with Mozilla branding.
* XXX: document refactoring here when we're finished with it.
* Allow LocalVerifier to use of a custom JWT parser.
- * Remove vep.verify_[remote|local|dummy] since they just cause
- confusion. You should either accept the defaults provided by
- vep.verify, or use a full-blown Verifier object.
+ * Remove browserid.verify_[remote|local|dummy] since they just cause
+ confusion. You should either accept the defaults provided by the
+ browserid.verify function, or use a full-blown Verifier object.
0.3.2 - 2012-02-03
==================
2  MANIFEST.in
View
@@ -1,3 +1,3 @@
include CHANGES.txt
include README.rst
-recursive-include vep *.crt *.key
+recursive-include browserid *.crt *.key
19 README.rst
View
@@ -1,20 +1,15 @@
-=======================================================
-PyVEP: a python library for the Verified Email Protocol
-=======================================================
+========================================================
+PyBrowserID: a python library for the BrowserID Protocol
+========================================================
-This is a python client library for the Verified Email Protocol, a.k.a
-Mozilla's BrowserID project. See here for details:
-
- https://wiki.mozilla.org/Identity/Verified_Email_Protocol
-
-And see here for how to integrate it into your website:
+This is a python client library for the BrowserID Protocol:
https://browserid.org/
For the vast majority of deployments, you will simply want to call the "verify"
functon to verify a given assertion::
- >>> data = vep.verify(BROWSERIDASSERTION, "http://mysite.com")
+ >>> data = browserid.verify(BROWSERIDASSERTION, "http://mysite.com")
>>> print data["email"]
"test@example.com"
@@ -26,7 +21,7 @@ If you have specialised needs, you can also create a "verifier" class to
encapsulate any custom settings you may require. For example, here is how
to do remote verification using a custom url-opening function::
- >>> verifier = vep.RemoteVerifier(urlopen=my_urlopen_func)
+ >>> verifier = browserid.RemoteVerifier(urlopen=my_urlopen_func)
>>> data = verifier.verify(BROWSERIDASSERTION, "http://mysite.com")
>>> print data["email"]
"test@example.com"
@@ -34,7 +29,7 @@ to do remote verification using a custom url-opening function::
For improved performance, or if you just want to live on the bleeding edge,
you can explicitly perform verification locally like so::
- >>> verifier = vep.LocalVerifier()
+ >>> verifier = browserid.LocalVerifier()
>>> data = verifier.verify(BROWSERIDASSERTION, "http://mysite.com")
>>> print data["email"]
"test@example.com"
43 browserid/__init__.py
View
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+"""
+
+Python library for the Verified Email Protocol.
+
+"""
+
+__ver_major__ = 0
+__ver_minor__ = 3
+__ver_patch__ = 2
+__ver_sub__ = ""
+__ver_tuple__ = (__ver_major__, __ver_minor__, __ver_patch__, __ver_sub__)
+__version__ = "%d.%d.%d%s" % __ver_tuple__
+
+
+from browserid.errors import (Error, # NOQA
+ ConnectionError, # NOQA
+ TrustError, # NOAQ
+ ExpiredSignatureError, # NOQA
+ InvalidSignatureError, # NOQA
+ AudienceMismatchError) # NOQA
+
+from browserid.verifiers.remote import RemoteVerifier # NOQA
+from browserid.verifiers.local import LocalVerifier # NOQA
+
+
+_DEFAULT_VERIFIER = None
+
+
+def verify(assertion, audience=None):
+ """Verify the given BrowserID assertion.
+
+ This function uses the "best" verification method available in order to
+ verify the given BrowserID assertion and return a dict of user data. The
+ best method currently involves POSTing to the hosted verifier service on
+ browserid.org; eventually it will do local verification.
+ """
+ global _DEFAULT_VERIFIER
+ if _DEFAULT_VERIFIER is None:
+ _DEFAULT_VERIFIER = RemoteVerifier()
+ return _DEFAULT_VERIFIER.verify(assertion, audience)
0  vep/_m2_monkeypatch.py → browserid/_m2_monkeypatch.py
View
File renamed without changes
30 vep/certificates.py → browserid/certificates.py
View
@@ -8,11 +8,11 @@
from urlparse import urljoin
-from vep.utils import secure_urlopen
-from vep.errors import (ConnectionError,
- InvalidIssuerError)
+from browserid.utils import secure_urlopen
+from browserid.errors import (ConnectionError,
+ InvalidIssuerError)
-WELL_KNOWN_URL = "/.well-known/vep"
+WELL_KNOWN_URL = "/.well-known/browserid"
class CertificatesManager(object):
@@ -49,11 +49,11 @@ def fetch_public_key(self, hostname):
class FIFOCache(object):
- """A simple in-memory FIFO cache for VEP public keys.
+ """A simple in-memory FIFO cache for BrowseriD public keys.
This is a *very* simple in-memory FIFO cache, used as the default object
- for caching VEP public keys in the LocalVerifier. Items are kept for
- 'cache_timeout' seconds before being evicted from the cache. If the
+ for caching BrowserID public keys in the LocalVerifier. Items are kept
+ for 'cache_timeout' seconds before being evicted from the cache. If the
'max_size' argument is not None and the cache grows above this size,
items will be evicted early in order of insertion into the cache.
@@ -142,9 +142,9 @@ def __len__(self):
def fetch_public_key(hostname, well_known_url=None):
- """Fetch the VEP public key for the given hostname.
+ """Fetch the BrowserID public key for the given hostname.
- This function uses the well-known VEP meta-data file to extract
+ This function uses the well-known BrowserID meta-data file to extract
the public key for the given hostname.
"""
if well_known_url is None:
@@ -155,10 +155,10 @@ def fetch_public_key(hostname, well_known_url=None):
# raise an InvalidIssuerError. Any other connection-related
# errors are passed back up to the caller.
try:
- # Try to read the well-known vep file to load the key.
+ # Try to read the well-known browserid file to load the key.
try:
- vep_url = urljoin(hostname, well_known_url)
- vep_data = urlread(vep_url)
+ browserid_url = urljoin(hostname, well_known_url)
+ browserid_data = urlread(browserid_url)
except ConnectionError, e:
if "404" not in str(e):
raise
@@ -176,15 +176,15 @@ def fetch_public_key(hostname, well_known_url=None):
# The well-known file was found, it must contain the key
# data as part of its JSON response.
try:
- key = json.loads(vep_data)["public-key"]
+ key = json.loads(browserid_data)["public-key"]
except (ValueError, KeyError):
- msg = "Host %r has malformed VEP metadata document"
+ msg = "Host %r has malformed BrowserID metadata document"
raise InvalidIssuerError(msg % (hostname,))
return key
except ConnectionError, e:
if "404" not in str(e):
raise
- msg = "Host %r does not declare support for VEP" % (hostname,)
+ msg = "Host %r does not declare support for BrowserID" % (hostname,)
raise InvalidIssuerError(msg)
10 vep/errors.py → browserid/errors.py
View
@@ -3,18 +3,18 @@
# You can obtain one at http://mozilla.org/MPL/2.0/.
"""
-Error classes for PyVEP.
+Error classes for PyBrowserID.
"""
class Error(Exception):
- """Base error class for all PyVEP exceptions."""
+ """Base error class for all PyBrowserID exceptions."""
pass
class ConnectionError(Error):
- """Error raised when PyVEP fails to connect to a remote server."""
+ """Error raised when PyBrowserID fails to connect to a remote server."""
pass
@@ -24,7 +24,7 @@ class TrustError(Error):
class InvalidSignatureError(TrustError):
- """Error raised when PyVEP encounters an invalid signature."""
+ """Error raised when PyBrowserID encounters an invalid signature."""
pass
@@ -34,7 +34,7 @@ class InvalidIssuerError(TrustError):
class ExpiredSignatureError(TrustError):
- """Error raised when PyVEP encounters an expired signature or assertion."""
+ """Error raised when PyBrowserID encounters an expired signature."""
pass
9 vep/jwt.py → browserid/jwt.py
View
@@ -10,11 +10,12 @@
import struct
import hashlib
from binascii import unhexlify
-from vep._m2_monkeypatch import DSA as _DSA
-from vep._m2_monkeypatch import RSA as _RSA
-from vep.utils import decode_bytes, encode_bytes
-from vep.utils import decode_json_bytes, encode_json_bytes
+from browserid._m2_monkeypatch import DSA as _DSA
+from browserid._m2_monkeypatch import RSA as _RSA
+
+from browserid.utils import decode_bytes, encode_bytes
+from browserid.utils import decode_json_bytes, encode_json_bytes
def parse(jwt, cls=None):
0  vep/verifiers/__init__.py → browserid/tests/__init__.py
View
File renamed without changes
2  vep/tests/certs/README.txt → browserid/tests/certs/README.txt
View
@@ -1,4 +1,4 @@
This directory contains verious self-signed TLS certificates, used for
-testing the secure_urlopen function for PyVEP.
+testing the secure_urlopen function for PyBrowserID.
0  vep/tests/certs/localhost.crt → browserid/tests/certs/localhost.crt
View
File renamed without changes
0  vep/tests/certs/localhost.key → browserid/tests/certs/localhost.key
View
File renamed without changes
0  vep/tests/certs/selfsigned.crt → browserid/tests/certs/selfsigned.crt
View
File renamed without changes
0  vep/tests/certs/selfsigned.key → browserid/tests/certs/selfsigned.key
View
File renamed without changes
16 vep/tests/support.py → browserid/tests/support.py
View
@@ -6,11 +6,11 @@
import hashlib
from contextlib import contextmanager
-from vep.utils import encode_bytes, bundle_certs_and_assertion
+from browserid.utils import encode_bytes, bundle_certs_and_assertion
-from vep import certificates
-from vep import jwt
-from vep.verifiers import remote
+from browserid import certificates
+from browserid import jwt
+from browserid.verifiers import remote
# These are values used to generate dummy DSA keys.
# I took them directly from the javacript jwcrypto source code, which claims:
@@ -45,7 +45,7 @@ def _hex(value):
def fetch_public_key(hostname):
- """Fetch the VEP public key for the given hostname.
+ """Fetch the BrowserID public key for the given hostname.
Actually, this implementation generates the key locally based on
a hash of the hostname. This lets us exercise all the crypto code
@@ -94,8 +94,8 @@ def make_assertion(email, audience, issuer=None, exp=None,
new_style=True):
"""Generate a new dummy assertion for the given email address.
- This method lets you generate VEP assertions using dummy private keys.
- Called with just an email and audience it will generate an assertion
+ This method lets you generate BrowserID assertions using dummy private
+ keys. Called with just an email and audience it will generate an assertion
from browserid.org.
By specifying the "exp", "assertion_sig" or "certificate_sig" arguments
@@ -130,7 +130,7 @@ def make_assertion(email, audience, issuer=None, exp=None,
if certificate_sig is not None:
certificate = ".".join(certificate.split(".")[:-1] +
[encode_bytes(certificate_sig)])
- # Combine them into a VEP bundled assertion.
+ # Combine them into a BrowserID bundled assertion.
return bundle_certs_and_assertion([certificate], assertion, new_style)
6 vep/tests/test_jwt.py → browserid/tests/test_jwt.py
View
@@ -4,9 +4,9 @@
import unittest
-from vep.tests.support import get_keypair
-from vep.utils import encode_json_bytes, encode_bytes
-from vep import jwt
+from browserid.tests.support import get_keypair
+from browserid.utils import encode_json_bytes, encode_bytes
+from browserid import jwt
class TestJWT(unittest.TestCase):
4 vep/tests/test_m2_monkeypatch.py → browserid/tests/test_m2_monkeypatch.py
View
@@ -4,8 +4,8 @@
import unittest
-from vep.jwt import int2mpint
-import vep._m2_monkeypatch as _m2
+from browserid.jwt import int2mpint
+import browserid._m2_monkeypatch as _m2
# Dummy RSA key for testing purposes.
7 vep/tests/test_utils.py → browserid/tests/test_utils.py
View
@@ -9,9 +9,10 @@
import ssl
import warnings
-from vep.errors import ConnectionError
-from vep.utils import secure_urlopen, encode_bytes, decode_bytes
-from vep.utils import encode_json_bytes, decode_json_bytes, get_assertion_info
+from browserid.errors import ConnectionError
+from browserid.utils import secure_urlopen, encode_bytes, decode_bytes
+from browserid.utils import encode_json_bytes, decode_json_bytes
+from browserid.utils import get_assertion_info
def _filepath(name):
38 vep/tests/test_verifiers.py → browserid/tests/test_verifiers.py
View
@@ -7,23 +7,23 @@
import unittest
import warnings
-import vep
-from vep.tests.support import (patched_urlopen,
- patched_key_fetching,
- get_keypair,
- fetch_public_key,
- make_assertion)
-from vep import jwt
-from vep import RemoteVerifier, LocalVerifier
-from vep.certificates import FIFOCache, CertificatesManager
-from vep.verifiers.workerpool import WorkerPoolVerifier
-from vep.utils import encode_json_bytes, decode_json_bytes
-from vep.errors import (TrustError,
- ConnectionError,
- ExpiredSignatureError,
- InvalidSignatureError,
- InvalidIssuerError,
- AudienceMismatchError)
+import browserid
+from browserid.tests.support import (patched_urlopen,
+ patched_key_fetching,
+ get_keypair,
+ fetch_public_key,
+ make_assertion)
+from browserid import jwt
+from browserid import RemoteVerifier, LocalVerifier
+from browserid.certificates import FIFOCache, CertificatesManager
+from browserid.verifiers.workerpool import WorkerPoolVerifier
+from browserid.utils import encode_json_bytes, decode_json_bytes
+from browserid.errors import (TrustError,
+ ConnectionError,
+ ExpiredSignatureError,
+ InvalidSignatureError,
+ InvalidIssuerError,
+ AudienceMismatchError)
# This is an old assertion I generated on myfavoritebeer.org.
# It's expired and signed with an old private key.
@@ -176,7 +176,7 @@ def read():
self.verifier.verify, EXPIRED_ASSERTION, now=0)
def test_well_known_doc_with_public_key(self):
- # The browserid.org server doesn't currently have /.well-known/vep.
+ # The browserid.org server doesn't currently have /.well-known/browserid.
# This simulates it with a dummy key.
def urlopen(url, data): # NOQA
class response(object):
@@ -417,4 +417,4 @@ def tearDown(self):
class TestShortcutFunction(unittest.TestCase):
def test_shortcut(self):
- self.assertRaises(TrustError, vep.verify, EXPIRED_ASSERTION)
+ self.assertRaises(TrustError, browserid.verify, EXPIRED_ASSERTION)
10 vep/utils.py → browserid/utils.py
View
@@ -3,7 +3,7 @@
# You can obtain one at http://mozilla.org/MPL/2.0/.
"""
-Utility functions for PyVEP.
+Utility functions for PyBrowserID.
"""
@@ -18,7 +18,7 @@
import warnings
from fnmatch import fnmatch
-from vep.errors import ConnectionError
+from browserid.errors import ConnectionError
def decode_bytes(value):
@@ -80,7 +80,7 @@ def encode_json_bytes(obj):
def bundle_certs_and_assertion(certificates, assertion, new_style=True):
"""Bundle certificates and assertion into a single string.
- This function produces a VEP "bundled assertion" that combines the
+ This function produces a BrowserID "bundled assertion" that combines the
certificate chain and final assertion into a single string. By default
it uses the "new-style" tilde-separated format; pass new_style=False to
use the older b64-encoded-JSON format.
@@ -97,8 +97,8 @@ def bundle_certs_and_assertion(certificates, assertion, new_style=True):
def unbundle_certs_and_assertion(bundle):
"""Unbundle certificates and assertion from a single string.
- This function parse a VEP "bundled assertion" into the contained chain
- of certificates and final assertion. The returned value is a tuple
+ This function parses a BrowserID "bundled assertion" into the contained
+ chain of certificates and final assertion. The returned value is a tuple
(certificates, assertion).
"""
if "~" in bundle:
0  vep/tests/__init__.py → browserid/verifiers/__init__.py
View
File renamed without changes
30 vep/verifiers/local.py → browserid/verifiers/local.py
View
@@ -5,12 +5,12 @@
import time
import warnings
-from vep import jwt
-from vep.certificates import CertificatesManager
-from vep.utils import unbundle_certs_and_assertion
-from vep.errors import (InvalidSignatureError,
- ExpiredSignatureError,
- AudienceMismatchError)
+from browserid import jwt
+from browserid.certificates import CertificatesManager
+from browserid.utils import unbundle_certs_and_assertion
+from browserid.errors import (InvalidSignatureError,
+ ExpiredSignatureError,
+ AudienceMismatchError)
DEFAULT_TRUSTED_SECONDARIES = ("browserid.org", "diresworb.org",
@@ -18,11 +18,11 @@
class LocalVerifier(object):
- """Class for local verification of VEP identity assertions.
+ """Class for local verification of BrowserID identity assertions.
This class implements the logic for verifying identity assertions under
- the Verified Email Protocol. Pass a VEP assertion token to the verify()
- method and let it work its magic.
+ the Verified Email Protocol. Pass a BrowserID assertion token to the
+ verify() method and let it work its magic.
"""
def __init__(self, trusted_secondaries=None, certs=None,
@@ -44,11 +44,11 @@ def parse_jwt(self, data):
return jwt.parse(data, self.parser_cls)
def verify(self, assertion, audience=None, now=None):
- """Verify the given VEP assertion.
+ """Verify the given BrowserID assertion.
- This method parses a VEP identity assertion, verifies the bundled
- chain of certificates and signatures, and returns the extracted
- email address and audience.
+ This method parses a BrowserID identity assertion, verifies the
+ bundled chain of certificates and signatures, and returns the
+ extracted email address and audience.
If the 'audience' argument is given, it first verifies that the
audience of the assertion matches the one given. This can help
@@ -136,8 +136,8 @@ def verify_certificate_chain(self, certificates, now=None):
def _emit_warning():
"""Emit a scary warning so users will know this isn't final yet."""
- msg = "The VEP certificate format has not been finalized and may "\
+ msg = "The BrowserID certificate format has not been finalized and may "\
"change in backwards-incompatible ways. If you find that "\
"the latest version of this module cannot verify a valid "\
- "VEP assertion, please contact the author."
+ "BrowserID assertion, please contact the author."
warnings.warn(msg, FutureWarning, stacklevel=3)
18 vep/verifiers/remote.py → browserid/verifiers/remote.py
View
@@ -4,12 +4,12 @@
import json
-from vep.utils import (secure_urlopen,
- decode_json_bytes,
- unbundle_certs_and_assertion)
-from vep.errors import (InvalidSignatureError,
- ConnectionError,
- AudienceMismatchError)
+from browserid.utils import (secure_urlopen,
+ decode_json_bytes,
+ unbundle_certs_and_assertion)
+from browserid.errors import (InvalidSignatureError,
+ ConnectionError,
+ AudienceMismatchError)
BROWSERID_VERIFIER_URL = "https://browserid.org/verify"
@@ -18,7 +18,7 @@
class RemoteVerifier(object):
- """Class for remote verification of VEP identity assertions.
+ """Class for remote verification of BrowserID identity assertions.
This class submits assertions to the browserid.org verifier service
for remote verification. It's slower but potentially a little bit
@@ -31,9 +31,9 @@ def __init__(self, verifier_url=None):
self.verifier_url = verifier_url
def verify(self, assertion, audience=None):
- """Verify the given VEP assertion.
+ """Verify the given BrowserID assertion.
- This method posts the given VEP assertion to the remove verifier
+ This method posts the given BrowserID assertion to the remote verifier
service. If it is successfully verified then a dict giving the
email and audience is returned. If it is not valid then an error
is raised.
6 vep/verifiers/workerpool.py → browserid/verifiers/workerpool.py
View
@@ -5,7 +5,7 @@
import threading
import multiprocessing
-from vep.verifiers.local import LocalVerifier
+from browserid.verifiers.local import LocalVerifier
class WorkerPoolVerifier(object):
@@ -61,9 +61,9 @@ def __del__(self):
self.close()
def verify(self, *args, **kwds):
- """Verify the given VEP assertion.
+ """Verify the given BrowserID assertion.
- This method parses a VEP identity assertion, verifies the bundled
+ This method parses a BrowserID identity assertion, verifies the bundled
chain of certificates and signatures, and returns the extracted
email address and audience.
12 setup.py
View
@@ -12,9 +12,9 @@
requires = ['M2Crypto']
-setup(name='PyVEP',
- version='0.3.2',
- description='Python library for the Verified Email Protocol',
+setup(name='PyBrowserID',
+ version='0.4.0',
+ description='Python library for the BrowseriD Protocol',
long_description=README + '\n\n' + CHANGES,
license='MPLv2.0',
classifiers=[
@@ -23,11 +23,11 @@
],
author='Mozilla Identity Team',
author_email='dev-identity@lists.mozilla.org',
- url='https://github.com/mozilla/PyVEP',
- keywords='authentication vep browserid login email',
+ url='https://github.com/mozilla/PyBrowserID',
+ keywords='authentication browserid login email',
packages=find_packages(),
include_package_data=True,
zip_safe=False,
install_requires=requires,
tests_require=requires,
- test_suite="vep")
+ test_suite="browserid")
43 vep/__init__.py
View
@@ -1,43 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this file,
-# You can obtain one at http://mozilla.org/MPL/2.0/.
-"""
-
-Python library for the Verified Email Protocol.
-
-"""
-
-__ver_major__ = 0
-__ver_minor__ = 3
-__ver_patch__ = 2
-__ver_sub__ = ""
-__ver_tuple__ = (__ver_major__, __ver_minor__, __ver_patch__, __ver_sub__)
-__version__ = "%d.%d.%d%s" % __ver_tuple__
-
-
-from vep.errors import (Error, # NOQA
- ConnectionError, # NOQA
- TrustError, # NOAQ
- ExpiredSignatureError, # NOQA
- InvalidSignatureError, # NOQA
- AudienceMismatchError) # NOQA
-
-from vep.verifiers.remote import RemoteVerifier # NOQA
-from vep.verifiers.local import LocalVerifier # NOQA
-
-
-_DEFAULT_REMOTE_VERIFIER = None
-
-
-def verify(assertion, audience=None):
- """Verify the given VEP assertion.
-
- This function uses the "best" verification method available in order to
- verify the given VEP assertion and return a dict of user data. The best
- method currently involves POSTing to the hosted verifier service on
- browserid.org; eventually it will do local verification.
- """
- global _DEFAULT_REMOTE_VERIFIER
- if _DEFAULT_REMOTE_VERIFIER is None:
- _DEFAULT_REMOTE_VERIFIER = RemoteVerifier()
- return _DEFAULT_REMOTE_VERIFIER.verify(assertion, audience)
Please sign in to comment.
Something went wrong with that request. Please try again.