def get_api(fn, scopes): esi_app = App.create( 'https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility') esi_security = EsiSecurity( app=esi_app, redirect_uri='http://localhost:8080/callback', client_id='0b9ac4978a9a4feba20a7eba4f666a46', secret_key='odtDKZWZbwbFnBHNXnOhRX50YrU49owBw1qE3v7p', ) esi_client = EsiClient(retry_requests=True, security=esi_security) def write_refresh_token(refresh_token, **kwargs): with open(fn, "w") as f: f.write(refresh_token) AFTER_TOKEN_REFRESH.add_receiver(write_refresh_token) if os.path.isfile(fn): with open(fn) as f: token = open(fn).read() esi_security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': token }) tokens = esi_security.refresh() else: print(esi_security.get_auth_uri(scopes=scopes)) tokens = esi_security.auth(input()) write_refresh_token(**tokens) api_info = esi_security.verify() return api_info, esi_app, esi_client
def ESIMail(self, KilledCharID): security = EsiSecurity( app=self.app, redirect_uri='http://localhost/callback/', client_id=GlobalConsts.CLIENTID, secret_key=GlobalConsts.SECRETKEY, ) print(security.get_auth_uri(scopes=GlobalConsts.REQUESTSCOPES)) try: tokens = security.auth(GlobalConsts.CHARAUTHTOKEN) except: security.refresh_token = GlobalConsts.CHARREFRESHTOKEN tokens = security.refresh() accessToken = tokens[GlobalConsts.TOKENAUTHKEY] RefreshToken = tokens[GlobalConsts.TOKENREFRESHKEY] expire_date = datetime.fromtimestamp( time.time() + tokens[GlobalConsts.TOKENEXPIRESKEY], ) api_info = security.verify() strCharacterID = api_info['CharacterID'] Response = SendMail(strCharacterID, KilledCharID, GlobalConsts.DEFAULTMESSAGE, accessToken) if Response.status_code == GlobalConsts.SUCCESSRESPONSECODE: print("Sent message to characterid {0}".format(KilledCharID)) else: print("Failed to send message to characterid {0}".format( KilledCharID))
def authenticate(): app = App.create( url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility" ) security = EsiSecurity( app=app, redirect_uri='http://localhost:51350', client_id=secret['client_id'], secret_key=secret['secret_key'], ) client = EsiClient(retry_requests=True, header={'User-Agent': 'shipLocation'}, security=security) eve_sso_auth_url = security.get_auth_uri( scopes=['esi-location.read_ship_type.v1']) webbrowser.open(eve_sso_auth_url, new=2) # open in a new browser tab auth_code = fetch_auth_code( ) # fetch authentication code using a temporary web server tokens = security.auth(auth_code) return (app, client, security, tokens)
def do_security(tokens_file, scopes): esi_app = EsiApp(cache=cache, cache_time=0) app = esi_app.get_latest_swagger security = EsiSecurity(redirect_uri=redirect_uri, client_id=client_id, secret_key=secret_key, headers=headers) client = EsiClient(retry_requests=True, headers=headers, security=security) print("Open link in browser and authorize") print(security.get_auth_uri(scopes=scopes)) code = input("Enter in code:\n") tokens = security.auth(code) print(tokens) print("\n Writing tokens to " + str(tokens_file)) with open(tokens_file, 'wb') as fp: pickle.dump(tokens, fp) fp.close()
class ESI: def __init__(self): self.db = Database() self.config = Config() self.scopes = self.config.getConfig()["settings"]["esiScopes"] self.esi_app = App.create( url=self.config.getConfig()["settings"]["esiURL"], ) self.security = EsiSecurity( app=self.esi_app, redirect_uri=self.config.getConfig()["settings"]["esiCallback"], client_id=self.config.getConfig()["settings"]["esiClientID"], secret_key=self.config.getConfig()["settings"]["esiSecretKey"], headers={ 'User-Agent': self.config.getConfig()["settings"]["esiCustomHeader"] }) self.client = EsiClient( security=self.security, retry_requests=True, headers={ 'User-Agent': self.config.getConfig()["settings"]["esiCustomHeader"] }) def getAuthURI(self): return self.security.get_auth_uri(scopes=self.scopes) def getToken(self, code): return self.security.auth(code) def getESIChar(self, token): self.security.update_token(token) try: self.security.refresh() except APIException as e: if str(e) == "HTTP Error 400: invalid_token": session.pop('token', None) session.pop('char', None) return redirect(url_for('page_routes.logout')) return self.security.verify() def isVerified(self, token): try: self.security.update_token(token) except: return False try: self.security.refresh() character = self.security.verify() except: return False session["char"] = character return True def getESIInfo(self, endpoint, obj): info = self.esi_app.op[endpoint](**obj) res = self.client.request(info) result = res.data try: if "response" in result: result = result["response"] except: pass return result def getESIInfoMP(self, endpoint, obj): info = self.esi_app.op[endpoint](**obj) res = self.client.head(info) if res.status == 200: number_of_pages = res.header["X-Pages"][0] ops = [] for page in range(1, number_of_pages + 1): obj["page"] = page ops.append(self.esi_app.op[endpoint](**obj)) results = self.client.multi_request(ops) return results return {} def subToken(self, refresh_token): self.security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': refresh_token }) def getForceRefresh(self): return self.security.refresh()
class TestEsiSecurity(unittest.TestCase): CALLBACK_URI = "https://foo.bar/baz/callback" CLIENT_ID = 'foo' SECRET_KEY = 'bar' BASIC_TOKEN = six.u('Zm9vOmJhcg==') SECURITY_NAME = 'evesso' TOKEN_IDENTIFIER = 'ESIPY_TEST_TOKEN' CODE_VERIFIER = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk" CODE_CHALLENGE = "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM" RSC_SSO_ENDPOINTS = "test/resources/oauth-authorization-server.json" RSC_JWKS = "test/resources/jwks.json" def setUp(self): warnings.simplefilter('ignore') self.custom_refresh_token_signal = Signal() with httmock.HTTMock(*_all_auth_mock_): self.security = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, signal_token_updated=self.custom_refresh_token_signal, token_identifier=TestEsiSecurity.TOKEN_IDENTIFIER) self.security_pkce = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, code_verifier=TestEsiSecurity.CODE_VERIFIER, ) with open(TestEsiSecurity.RSC_SSO_ENDPOINTS, 'r') as sso_endpoints: self.sso_endpoints = json.load(sso_endpoints) def test_esisecurity_init(self): with httmock.HTTMock(*_all_auth_mock_): with self.assertRaises(AttributeError): EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, sso_endpoints_url="") with self.assertRaises(AttributeError): EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID) with open(TestEsiSecurity.RSC_JWKS, 'r') as jwks: jwks = json.load(jwks) EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, jwks_key=jwks['keys'][0]) self.assertEqual(self.security.security_name, TestEsiSecurity.SECURITY_NAME) self.assertEqual(self.security.redirect_uri, TestEsiSecurity.CALLBACK_URI) self.assertEqual(self.security.client_id, TestEsiSecurity.CLIENT_ID) self.assertEqual(self.security.secret_key, TestEsiSecurity.SECRET_KEY) self.assertEqual(self.security.token_identifier, TestEsiSecurity.TOKEN_IDENTIFIER) self.assertEqual(self.security.oauth_issuer, self.sso_endpoints['issuer']) self.assertEqual(self.security.oauth_authorize, self.sso_endpoints['authorization_endpoint']) self.assertEqual(self.security.oauth_token, self.sso_endpoints['token_endpoint']) self.assertEqual(self.security.oauth_revoke, self.sso_endpoints['revocation_endpoint']) def test_esisecurity_update_token(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) self.assertEqual(self.security.access_token, 'access_token') self.assertEqual(self.security.refresh_token, 'refresh_token') self.assertEqual(self.security.token_expiry, int(time.time() + 60)) def test_esisecurity_get_auth_uri(self): with self.assertRaises(AttributeError): self.security.get_auth_uri(state="") self.assertEqual(self.security.get_auth_uri(state='teststate'), ("%s?response_type=code" "&redirect_uri=%s&client_id=%s&state=teststate") % (self.sso_endpoints['authorization_endpoint'], quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) self.assertEqual( self.security.get_auth_uri(implicit=True, state='teststate'), ("%s?response_type=token" "&redirect_uri=%s&client_id=%s&state=teststate") % (self.sso_endpoints['authorization_endpoint'], quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) scopes = ["Scope1", "Scope2"] self.assertEqual( self.security.get_auth_uri(scopes=scopes, state='teststate'), ("%s?response_type=code&redirect_uri=%s" "&client_id=%s&scope=Scope1+Scope2&state=teststate") % (self.sso_endpoints['authorization_endpoint'], quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) def test_esisecurity_get_access_token_request_params(self): params = self.security.get_access_token_params('foo') self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], self.sso_endpoints['token_endpoint']) self.assertEqual(params['data'], { 'grant_type': 'authorization_code', 'code': 'foo', }) def test_esisecurity_get_refresh_token_request_params(self): with self.assertRaises(AttributeError): self.security.get_refresh_token_params() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) # refresh all scopes params = self.security.get_refresh_token_params() self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], self.sso_endpoints['token_endpoint']) self.assertEqual(params['data'], { 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token', }) # refresh specific scopes params = self.security.get_refresh_token_params(scope_list=['a', 'b']) self.assertEqual( params['data'], { 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token', 'scope': 'a+b' }) # refresh specific scopes exception with self.assertRaises(AttributeError): self.security.get_refresh_token_params(scope_list='notalist') def test_esisecurity_token_expiry(self): self.security.token_expiry = None self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() - 10 self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() + 60 self.assertFalse(self.security.is_token_expired()) self.assertTrue(self.security.is_token_expired(offset=70)) def test_esisecurity_auth(self): with httmock.HTTMock(oauth_token): ret = self.security.auth('let it bee') self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) ret = self.security.auth('no_refresh') self.assertEqual(ret['access_token'], 'access_token') self.assertNotIn('refresh_token', ret) self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.auth('fail_test') def test_esisecurity_refresh(self): with httmock.HTTMock(oauth_token): self.security.refresh_token = 'refresh_token' ret = self.security.refresh() self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.refresh_token = 'fail_test_token' self.security.refresh() def test_esisecurity_revoke(self): with httmock.HTTMock(oauth_revoke): self.security.refresh_token = 'refresh_token' self.security.revoke() self.security.access_token = 'access_token' self.security.revoke() with self.assertRaises(AttributeError): self.security.revoke() def test_esisecurity_verify(self): # this is just for coverage purpose. This doesn't work without valid # jwt token with self.assertRaises(AttributeError): self.security.verify() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with self.assertRaises(JWTError): self.security.verify() with httmock.HTTMock(*_all_auth_mock_): with open(TestEsiSecurity.RSC_JWKS, 'r') as jwks: jwks = json.load(jwks) security_nojwks = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, jwks_key=jwks['keys'][0]) security_nojwks.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with self.assertRaises(JWTError): security_nojwks.verify() def test_esisecurity_call(self): class RequestTest(object): def __init__(self): self._security = [] self._p = {'header': {}} self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) req = RequestTest() self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'unknown_security_name': {}, }) self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'evesso': {}, }) self.security(req) self.assertIn('Authorization', req._p['header']) self.assertEqual('Bearer access_token', req._p['header']['Authorization']) def test_esisecurity_callback_refresh(self): class RequestTest(object): """ pyswagger Request object over simplified for test purpose""" def __init__(self): self._security = ['evesso'] self._p = {'header': {}} def callback_function(**kwargs): callback_function.count += 1 callback_function.count = 0 self.custom_refresh_token_signal.add_receiver(callback_function) self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': -1 }) # test the auto refresh callback event customized with httmock.HTTMock(oauth_token): req = RequestTest() self.security(req) self.assertEqual(callback_function.count, 1) def test_esisecurity_non_json_response(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': -1 }) with httmock.HTTMock(non_json_error): try: self.security.auth('somecode') except APIException as exc: self.assertEqual(exc.status_code, 502) self.assertEqual( exc.response, six.b('<html><body>Some HTML Errors</body></html>')) try: self.security.refresh() except APIException as exc: self.assertEqual(exc.status_code, 502) self.assertEqual( exc.response, six.b('<html><body>Some HTML Errors</body></html>')) def test_esisecurity_pkce(self): uri = self.security_pkce.get_auth_uri('test') self.assertIn('code_challenge=%s' % TestEsiSecurity.CODE_CHALLENGE, uri) params = self.security_pkce.get_access_token_params('test') self.assertEqual(params['data']['code_verifier'], TestEsiSecurity.CODE_VERIFIER) self.assertEqual(params['data']['client_id'], TestEsiSecurity.CLIENT_ID) self.assertNotIn('Authorization', params['headers'])
SECRET_KEY = '' SCOPES = [ 'esi-universe.read_structures.v1', 'esi-markets.structure_markets.v1' ] app = Flask(__name__) esi_app = App.create( url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility") security = EsiSecurity(app=esi_app, redirect_uri='http://127.0.0.1:5000/ESICallback', client_id=CLIENT_ID, secret_key=SECRET_KEY) client = EsiClient(retry_requests=True, header={'User-Agent': 'ESI Token Fetcher'}, security=security) webbrowser.open_new(security.get_auth_uri(scopes=SCOPES)) @app.route('/ESICallback') def esi_callback(): code = request.args.get('code', '') if code: tokens = security.auth(code) return str(tokens) else: return 'No code returned!'
from esipy import EsiSecurity from esipy import App from esipy import EsiClient from esipy import EsiSecurity esi_app = App.create('https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility') esi_security = EsiSecurity( app=esi_app, redirect_uri='https://localhost/callback/', client_id='ab6c5ead15684e91914db83850aba714', secret_key='MpHBlfeDZPOVarvJRJB8EzsfM1WPL5u7CYiOXqQx' ) uri = esi_security.get_auth_uri(scopes=['esi-wallet.read_character_wallet.v1']) esi_client = EsiClient(esi_security) # Create response header to load afterwards back header_re = { "access_token": '%s' % file.acc, "token_type":"Bearer", "expires_in": int(file.exp_t_s), "refresh_token":"***static***" } #This was for authentication to generate auth-code to get access token
client_id=config.ESI_CLIENT_ID, secret_key=config.ESI_SECRET_KEY, # code_verifier=generate_code_verifier() headers={'User-Agent': config.ESI_USER_AGENT}) # init the client client = EsiClient( cache=cache, security=security, headers={'User-Agent': config.ESI_USER_AGENT}, retry_requests=True, ) ### Authenticate eve_sso_auth_url = security.get_auth_uri( state=helpers.generate_state_token(), # scopes=config.ESI_SCOPES # or None (default) if you don't need any scope scopes=['publicData']) webbrowser.open_new_tab(eve_sso_auth_url) code = input('Code: ') tokens = security.auth(code) security.verify() m = trade.Markets(app, client) # m.get_space_rich_jita() m.get_space_rich_amarr() print('debug')
class TestEsiSecurity(unittest.TestCase): CALLBACK_URI = "https://foo.bar/baz/callback" LOGIN_EVE = "https://login.eveonline.com" OAUTH_VERIFY = "https://esi.tech.ccp.is/verify/" OAUTH_TOKEN = "%s/oauth/token" % LOGIN_EVE OAUTH_AUTHORIZE = "%s/oauth/authorize" % LOGIN_EVE CLIENT_ID = 'foo' SECRET_KEY = 'bar' BASIC_TOKEN = six.u('Zm9vOmJhcg==') SECURITY_NAME = 'evesso' @mock.patch('six.moves.urllib.request.urlopen') def setUp(self, urlopen_mock): # I hate those mock... thx urlopen instead of requests... urlopen_mock.return_value = open('test/resources/swagger.json') self.app = App.create('https://esi.tech.ccp.is/latest/swagger.json') self.security = EsiSecurity( app=self.app, redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, ) def test_esisecurity_init_with_app(self): """ test security init with app and URL""" with self.assertRaises(NameError): EsiSecurity(app=self.app, redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, security_name="security_name_that_does_not_exist") with self.assertRaises(AttributeError): EsiSecurity(app=self.app, redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, esi_url="") self.assertEqual(self.security.security_name, TestEsiSecurity.SECURITY_NAME) self.assertEqual(self.security.redirect_uri, TestEsiSecurity.CALLBACK_URI) self.assertEqual(self.security.client_id, TestEsiSecurity.CLIENT_ID) self.assertEqual(self.security.secret_key, TestEsiSecurity.SECRET_KEY) self.assertEqual(self.security.oauth_verify, TestEsiSecurity.OAUTH_VERIFY) self.assertEqual(self.security.oauth_token, TestEsiSecurity.OAUTH_TOKEN) self.assertEqual(self.security.oauth_authorize, TestEsiSecurity.OAUTH_AUTHORIZE) def test_esisecurity_other_init(self): """ test security init without app and with urls """ with self.assertRaises(AttributeError): EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, sso_url="") security = EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, sso_url='foo.com', esi_url='bar.baz') self.assertEqual(security.oauth_verify, "bar.baz/verify/") self.assertEqual(security.oauth_token, "foo.com/oauth/token") self.assertEqual(security.oauth_authorize, "foo.com/oauth/authorize") def test_esisecurity_update_token(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) self.assertEqual(self.security.access_token, 'access_token') self.assertEqual(self.security.refresh_token, 'refresh_token') self.assertEqual(self.security.token_expiry, int(time.time() + 60)) def test_esisecurity_get_auth_uri(self): self.assertEqual(self.security.get_auth_uri(), ("%s/oauth/authorize?response_type=code" "&redirect_uri=%s&client_id=%s") % (TestEsiSecurity.LOGIN_EVE, quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) self.assertEqual(self.security.get_auth_uri(implicit=True), ("%s/oauth/authorize?response_type=token" "&redirect_uri=%s&client_id=%s") % (TestEsiSecurity.LOGIN_EVE, quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) scopes = ["Scope1", "Scope2"] state = "foo" self.assertEqual(self.security.get_auth_uri( scopes, state), ("%s/oauth/authorize?response_type=code&redirect_uri=%s" "&client_id=%s&scope=Scope1+Scope2&state=foo") % (TestEsiSecurity.LOGIN_EVE, quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) def test_esisecurity_get_access_token_request_params(self): params = self.security.get_access_token_request_params('foo') self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], TestEsiSecurity.OAUTH_TOKEN) self.assertEqual(params['data'], { 'grant_type': 'authorization_code', 'code': 'foo', }) def test_esisecurity_get_refresh_token_request_params(self): with self.assertRaises(AttributeError): self.security.get_refresh_token_request_params() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) params = self.security.get_refresh_token_request_params() self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], TestEsiSecurity.OAUTH_TOKEN) self.assertEqual(params['data'], { 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token', }) def test_esisecurity_token_expiry(self): self.security.token_expiry = None self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() - 10 self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() + 60 self.assertFalse(self.security.is_token_expired()) self.assertTrue(self.security.is_token_expired(offset=70)) def test_esisecurity_auth(self): with httmock.HTTMock(oauth_token): ret = self.security.auth('let it bee') self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) ret = self.security.auth('no_refresh') self.assertEqual(ret['access_token'], 'access_token') self.assertNotIn('refresh_token', ret) self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.auth('fail_test') def test_esisecurity_refresh(self): with httmock.HTTMock(oauth_token): self.security.refresh_token = 'refresh_token' ret = self.security.refresh() self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.refresh_token = 'fail_test_token' self.security.refresh() def test_esisecurity_verify(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with httmock.HTTMock(oauth_verify): char_data = self.security.verify() self.assertEqual(char_data['CharacterID'], 123456789) self.assertEqual(char_data['CharacterName'], 'EsiPy Tester') self.assertEqual(char_data['CharacterOwnerHash'], 'YetAnotherHash') with httmock.HTTMock(oauth_verify_fail): with self.assertRaises(APIException): self.security.verify() def test_esisecurity_call(self): class RequestTest(object): def __init__(self): self._security = [] self._p = {'header': {}} self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) req = RequestTest() self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'unknown_security_name': {}, }) self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'evesso': {}, }) self.security(req) self.assertIn('Authorization', req._p['header']) self.assertEqual('Bearer access_token', req._p['header']['Authorization'])
# replace the redirect_uri, client_id and secret_key values # with the values you get from the STEP 1 ! security = EsiSecurity( app=app, redirect_uri='http://*****:*****@gmail.com'}, security=security) # this print a URL where we can log in print security.get_auth_uri(scopes=['esi-markets.structure_markets.v1']) tokens = security.auth( 'drsYPDYBwgMwNKkLOS2egrb-vlpxzITrrDJFiE-lO_4HKjVbLuXOfoGySZlR3hsw0') print tokens { "access_token": "frenafeifafrbaefluerbfeainb", "token_type": "Bearer", "expires_in": 1200, "refresh_token": "fera48ftea4at64fr684fae" } # use the verify endpoint to know who we are api_info = security.verify()
app = Flask(__name__) esi_app = App.create( url="https://esi.evetech.net/latest/swagger.json?datasource=tranquility") security = EsiSecurity(app=esi_app, redirect_uri='http://127.0.0.1:5000/ESICallback', headers={'User-Agent': 'ESI Token Fetcher'}, client_id=CLIENT_ID, secret_key=SECRET_KEY) client = EsiClient(retry_requests=True, headers={'User-Agent': 'ESI Token Fetcher'}, security=security) state = ''.join(random.choices(string.ascii_letters + string.digits, k=32)) webbrowser.open_new(security.get_auth_uri(scopes=SCOPES, state=state)) @app.route('/ESICallback') def esi_callback(): url_state = request.args.get('state', '') if url_state != state: return 'Invalid state token returned!' code = request.args.get('code', '') if code: tokens = security.auth(code) return str(tokens) else:
connection = database.create_connection( "rollcall", "postgres", cfg.db_password, "127.0.0.1", "5432" ) connection.autocommit = True cursor = connection.cursor() security = EsiSecurity( redirect_uri='http://51.158.104.35:5000/tokens/new', client_id='1922eb4bb2294e1ab3f47f15b50de475', secret_key= cfg.secret, headers={'User-Agent': cfg.agent}, ) print (security.get_auth_uri(state=randint(100000000, 999999999), scopes=['esi-fleets.read_fleet.v1'])) def create_app(config_filename=None): app = Flask(__name__, instance_relative_config=True) # app.config.from_pyfile(config_filename) register_blueprints(app) return app root_blueprint = Blueprint('root', __name__) @root_blueprint.route('/tokens/new') def receive_token(): auth_code = request.args.get("code")
app.config['CORPORATION_ID'] = 98538579 ## ESI from esipy import App as esiapp from esipy import EsiClient, EsiSecurity esi_app = esiapp.create( url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility") esi_security = EsiSecurity( app=esi_app, redirect_uri=app.config['ESI_CALLBACK_URL'], client_id=app.config['ESI_CLIENT_ID'], secret_key=app.config['ESI_SECRET_KEY'], ) esi_client = EsiClient( retry_requests=True, header={ 'User-Agent': 'Something CCP can use to contact you and that define your app' }, raw_body_only=False, security=esi_security) app.config['ESI_REDIRECT_URL'] = esi_security.get_auth_uri( scopes=['esi-contracts.read_corporation_contracts.v1'], state="None") app.config['esi_security'] = esi_security app.config['esi_client'] = esi_client app.config['esi_app'] = esi_app app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://' + app.config[ 'SQL_USER'] + ':' + app.config['SQL_PASSWORD'] + '@localhost/dev' db = SQLAlchemy(app)
SCOPES = ['esi-universe.read_structures.v1', 'esi-markets.structure_markets.v1'] app = Flask(__name__) esi_app = App.create(url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility") security = EsiSecurity( app=esi_app, redirect_uri='http://127.0.0.1:5000/ESICallback', client_id=CLIENT_ID, secret_key=SECRET_KEY ) client = EsiClient( retry_requests=True, header={'User-Agent': 'ESI Token Fetcher'}, security=security ) webbrowser.open_new(security.get_auth_uri(scopes=SCOPES)) @app.route('/ESICallback') def esi_callback(): code = request.args.get('code', '') if code: tokens = security.auth(code) return str(tokens) else: return 'No code returned!'
headers={'User-Agent': 'your app name'}, security=security ) # import scope # with open ('scopes', 'rb') as fp: # scopeslist = pickle.load(fp) sscp = app.root._Swagger__securityDefinitions['evesso']._SecurityScheme__scopes scopeslist = list() for i in sscp: scopeslist.append(i) # this print a URL where we can log in print(security.get_auth_uri(scopes=scopeslist)) print("please copy your code and paste here\n") authcode = input() # YOUR_CODE is the code you got from Step 3. (do not forget quotes around it) tokens = security.auth(authcode) print(tokens) # use the verify endpoint to know who we are api_info = security.verify() print(api_info) # api_info contains data like this # { # "Scopes": "esi-wallet.read_character_wallet.v1", # "ExpiresOn": "2017-07-14T21:09:20",
from esipy import App, EsiClient, EsiSecurity from esipy.exceptions import APIException from .settings import ESI_URL, ESI_CONNECT_IMG_BAR, ESI_CLIENT_ID, ESI_SECRET_KEY, ESI_CALLBACK_URL, ESI_SCOPES esi_app = App.create(ESI_URL) esi_security = EsiSecurity(app=esi_app, redirect_uri=ESI_CALLBACK_URL, client_id=ESI_CLIENT_ID, secret_key=ESI_SECRET_KEY) esi_client = EsiClient(security=esi_security) esi_scopes = ESI_SCOPES esi_secure = esi_security.get_auth_uri(scopes=esi_scopes) esi_secure_url = "<a href='" + esi_secure + "'><img src='" + ESI_CONNECT_IMG_BAR + "'></a>" def esi_update_token(request): esi_security.update_token(request.session['token']) def esi_refresh_verify(request): esi_security.update_token(request.session['token']) esi_security.refresh() return esi_security.verify() def esi_verify(): return esi_security.verify()
admin_id = int(bot_token_lines[1].strip()) keywords_auth = {'auth', '인증', '등록'} keywords_auth_cancel = {'auth_cancel', '인증취소', '등록취소'} keywords_dps = {'dps', 'vindi', 'vindicator', '디피', '빈디', '빈디케이터'} keywords_snp = { 'snp', 'sniper', 'nightmare', 'machariel', '스나', '나메', '나이트메어', '마차', '마차리엘' } keywords_logi = {'logi', 'scimitar', 'basilisk', '로지', '시미타', '바실리스크', '바실'} keywords_cancel = {'cancel', '취소'} esi_scopes = [ 'esi-location.read_location.v1', 'esi-fleets.read_fleet.v1', 'esi-fleets.write_fleet.v1', 'esi-fittings.read_fittings.v1', 'esi-characters.read_chat_channels.v1', 'esi-location.read_online.v1' ] auth_url = security.get_auth_uri(state='KIN3_FC_Auth', scopes=esi_scopes) auth_description = 'EVE 계정과 KIN3 대기열 봇을 연결\n인증명령어: `ㅊ인증 코드`' auth_embed = discord.Embed(title='계정등록 링크', url=auth_url, description=auth_description) server_list = KIN3_waitlist.server_list() periodic_5s_running = False periodic_60s_running = False tcp_server_online = False print(f'{KIN3_common.timestamp()} : Starting bot') bot.run(bot_token)