This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
pyoidc-ozwillo/tests/test_oauth2_provider.py

247 lines
8.1 KiB
Python
Raw Normal View History

2013-03-31 17:41:22 +02:00
from mako.lookup import TemplateLookup
2013-12-02 14:42:36 +01:00
from oic.oauth2 import rndstr
2013-09-23 12:08:42 +02:00
from oic.utils.authn.authn_context import AuthnBroker
2013-05-01 09:08:21 +02:00
from oic.utils.authn.client import verify_client
from oic.utils.authn.user import UserAuthnMethod
2014-01-22 14:49:46 +01:00
from oic.utils.authz import Implicit
2013-03-31 17:41:22 +02:00
from oic.utils.http_util import Response
from oic.oauth2.message import AuthorizationRequest
from oic.oauth2.message import AccessTokenRequest
from oic.oauth2.message import AccessTokenResponse
from oic.oauth2.message import TokenErrorResponse
2013-03-31 17:41:22 +02:00
from oic.utils import sdb
from oic.oauth2.consumer import Consumer
2013-03-31 17:41:22 +02:00
from oic.oauth2.provider import Provider
from utils_for_tests import _eq
CLIENT_CONFIG = {
2013-09-23 12:08:42 +02:00
"client_id": "client1",
"ca_certs": "/usr/local/etc/oic/ca_certs.txt",
}
CONSUMER_CONFIG = {
"authz_page": "/authz",
"flow_type": "code",
#"password": args.passwd,
"scope": [],
"response_type": "code",
#"expire_in": 600,
}
SERVER_INFO = {
"version": "3.0",
"issuer": "https://connect-op.heroku.com",
"authorization_endpoint": "http://localhost:8088/authorization",
"token_endpoint": "http://localhost:8088/token",
#"userinfo_endpoint":"http://localhost:8088/user_info",
#"check_id_endpoint":"http://localhost:8088/id_token",
#"registration_endpoint":"https://connect-op.heroku.com/connect/client",
#"scopes_supported":["openid","profile","email","address","PPID"],
"flows_supported": ["code", "token", "code token"],
#"identifiers_supported":["public","ppid"],
#"x509_url":"https://connect-op.heroku.com/cert.pem"
}
CDB = {
"a1b2c3": {
"password": "hemligt",
"client_secret": "drickyoughurt"
},
2013-03-31 17:41:22 +02:00
"client1": {
2013-09-23 12:08:42 +02:00
"client_secret": "hemlighet",
"redirect_uris": [("http://localhost:8087/authz", None)]
2013-03-31 17:41:22 +02:00
}
}
2013-03-31 17:41:22 +02:00
PASSWD = {"user": "password"}
2013-03-31 17:41:22 +02:00
ROOT = '../oc3/'
tl = TemplateLookup(directories=[ROOT + 'templates', ROOT + 'htdocs'],
module_directory=ROOT + 'modules',
input_encoding='utf-8', output_encoding='utf-8')
2013-03-31 17:41:22 +02:00
class DummyAuthn(UserAuthnMethod):
def __init__(self, srv, user):
UserAuthnMethod.__init__(self, srv)
self.user = user
2013-05-28 16:02:12 +02:00
def authenticated_as(self, cookie=None, **kwargs):
2013-03-31 17:41:22 +02:00
return {"uid": self.user}
2013-09-23 12:08:42 +02:00
AUTHN_BROKER = AuthnBroker()
2013-12-02 14:42:36 +01:00
AUTHN_BROKER.add("UNDEFINED", DummyAuthn(None, "username"))
2013-03-31 17:41:22 +02:00
# dealing with authorization
2013-09-23 12:08:42 +02:00
AUTHZ = Implicit()
def content_type(headers):
for key, val in headers:
if key == "Content-type":
if val == "application/json":
return "json"
def test_provider_init():
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ, verify_client)
assert provider
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ, verify_client,
2013-03-31 17:41:22 +02:00
urlmap={"client1": ["https://example.com/authz"]})
assert provider.urlmap["client1"] == ["https://example.com/authz"]
def test_provider_authorization_endpoint():
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ, verify_client)
bib = {"scope": ["openid"],
"state": "id-6da9ca0cc23959f5f33e8becd9b08cae",
"redirect_uri": "http://localhost:8087authz",
"response_type": ["code"],
"client_id": "a1b2c3"}
arq = AuthorizationRequest(**bib)
QUERY_STRING = arq.to_urlencoded()
2013-05-28 16:02:12 +02:00
resp = provider.authorization_endpoint(request=QUERY_STRING)
assert isinstance(resp, Response)
def test_provider_authenticated():
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ, verify_client, symkey=rndstr(16))
_session_db = {}
cons = Consumer(_session_db, client_config=CLIENT_CONFIG,
server_info=SERVER_INFO, **CONSUMER_CONFIG)
cons.debug = True
2014-10-01 11:37:06 +02:00
sid, location = cons.begin("http://localhost:8087",
"http://localhost:8088/authorization")
2013-12-02 14:42:36 +01:00
query_string = location.split("?")[1]
2013-12-02 14:42:36 +01:00
resp = provider.authorization_endpoint(query_string)
2013-09-23 12:08:42 +02:00
assert resp.status == "302 Found"
2013-03-31 17:41:22 +02:00
print resp.headers
print resp.message
2013-09-23 12:08:42 +02:00
if content_type(resp.headers) == "json":
resp = resp.message
else:
resp = resp.message.split("?")[1]
2013-03-31 17:41:22 +02:00
aresp = cons.handle_authorization_response(query=resp)
print aresp.keys()
assert aresp.type() == "AuthorizationResponse"
assert _eq(aresp.keys(), ['state', 'code'])
2014-10-01 11:37:06 +02:00
print cons.grant[sid].keys()
assert _eq(cons.grant[sid].keys(), ['tokens', 'code', 'exp_in',
'seed', 'id_token',
'grant_expiration_time'])
def test_provider_authenticated_token():
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ, verify_client, symkey=rndstr(16))
_session_db = {}
cons = Consumer(_session_db, client_config=CLIENT_CONFIG,
server_info=SERVER_INFO, **CONSUMER_CONFIG)
cons.debug = True
2014-10-01 11:37:06 +02:00
sid, location = cons.begin("http://localhost:8087",
"http://localhost:8088/authorization",
"token")
QUERY_STRING = location.split("?")[1]
2013-03-31 17:41:22 +02:00
resp = provider.authorization_endpoint(QUERY_STRING)
print resp.headers
print resp.message
txt = resp.message
assert "access_token=" in txt
assert "token_type=Bearer" in txt
def test_token_endpoint():
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ, verify_client, symkey=rndstr(16))
authreq = AuthorizationRequest(state="state",
redirect_uri="http://example.com/authz",
client_id="client1")
_sdb = provider.sdb
sid = _sdb.token.key(user="sub", areq=authreq)
access_grant = _sdb.token(sid=sid)
_sdb[sid] = {
"oauth_state": "authz",
"sub": "sub",
"authzreq": "",
"client_id": "client1",
"code": access_grant,
"code_used": False,
"redirect_uri": "http://example.com/authz"
}
# Construct Access token request
areq = AccessTokenRequest(code=access_grant,
redirect_uri="http://example.com/authz",
client_id="client1", client_secret="hemlighet",)
print areq.to_dict()
2013-05-28 16:02:12 +02:00
resp = provider.token_endpoint(request=areq.to_urlencoded())
print resp.message
atr = AccessTokenResponse().deserialize(resp.message, "json")
print atr.keys()
assert _eq(atr.keys(), ['access_token', 'expires_in', 'token_type',
'refresh_token'])
def test_token_endpoint_unauth():
2014-11-24 10:48:53 +01:00
provider = Provider("pyoicserv", sdb.SessionDB(SERVER_INFO["issuer"]), CDB,
AUTHN_BROKER, AUTHZ,
2013-12-02 14:42:36 +01:00
verify_client, symkey=rndstr(16))
authreq = AuthorizationRequest(state="state",
redirect_uri="http://example.com/authz",
client_id="client1")
_sdb = provider.sdb
sid = _sdb.token.key(user="sub", areq=authreq)
access_grant = _sdb.token(sid=sid)
_sdb[sid] = {
"oauth_state": "authz",
"sub": "sub",
"authzreq": "",
"client_id": "client1",
"code": access_grant,
"code_used": False,
"redirect_uri": "http://example.com/authz"
}
# Construct Access token request
areq = AccessTokenRequest(code=access_grant,
redirect_uri="http://example.com/authz",
client_id="client2", client_secret="hemlighet",)
print areq.to_dict()
2013-05-28 16:02:12 +02:00
resp = provider.token_endpoint(request=areq.to_urlencoded())
print resp.message
atr = TokenErrorResponse().deserialize(resp.message, "json")
print atr.keys()
2012-10-03 21:30:40 +02:00
assert _eq(atr.keys(), ['error_description', 'error'])
2013-05-28 16:02:12 +02:00
if __name__ == "__main__":
2014-10-01 11:37:06 +02:00
test_provider_authenticated()