comparison env/lib/python3.7/site-packages/boto/cognito/identity/layer1.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
comparison
equal deleted inserted replaced
4:79f47841a781 5:9b1c78e6ba9c
1 # Copyright (c) 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved
2 #
3 # Permission is hereby granted, free of charge, to any person obtaining a
4 # copy of this software and associated documentation files (the
5 # "Software"), to deal in the Software without restriction, including
6 # without limitation the rights to use, copy, modify, merge, publish, dis-
7 # tribute, sublicense, and/or sell copies of the Software, and to permit
8 # persons to whom the Software is furnished to do so, subject to the fol-
9 # lowing conditions:
10 #
11 # The above copyright notice and this permission notice shall be included
12 # in all copies or substantial portions of the Software.
13 #
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 # IN THE SOFTWARE.
21 #
22
23 import boto
24 from boto.compat import json
25 from boto.connection import AWSQueryConnection
26 from boto.regioninfo import RegionInfo
27 from boto.exception import JSONResponseError
28 from boto.cognito.identity import exceptions
29
30
31 class CognitoIdentityConnection(AWSQueryConnection):
32 """
33 Amazon Cognito
34 Amazon Cognito is a web service that delivers scoped temporary
35 credentials to mobile devices and other untrusted environments.
36 Amazon Cognito uniquely identifies a device and supplies the user
37 with a consistent identity over the lifetime of an application.
38
39 Using Amazon Cognito, you can enable authentication with one or
40 more third-party identity providers (Facebook, Google, or Login
41 with Amazon), and you can also choose to support unauthenticated
42 access from your app. Cognito delivers a unique identifier for
43 each user and acts as an OpenID token provider trusted by AWS
44 Security Token Service (STS) to access temporary, limited-
45 privilege AWS credentials.
46
47 To provide end-user credentials, first make an unsigned call to
48 GetId. If the end user is authenticated with one of the supported
49 identity providers, set the `Logins` map with the identity
50 provider token. `GetId` returns a unique identifier for the user.
51
52 Next, make an unsigned call to GetOpenIdToken, which returns the
53 OpenID token necessary to call STS and retrieve AWS credentials.
54 This call expects the same `Logins` map as the `GetId` call, as
55 well as the `IdentityID` originally returned by `GetId`. The token
56 returned by `GetOpenIdToken` can be passed to the STS operation
57 `AssumeRoleWithWebIdentity`_ to retrieve AWS credentials.
58 """
59 APIVersion = "2014-06-30"
60 DefaultRegionName = "us-east-1"
61 DefaultRegionEndpoint = "cognito-identity.us-east-1.amazonaws.com"
62 ServiceName = "CognitoIdentity"
63 TargetPrefix = "AWSCognitoIdentityService"
64 ResponseError = JSONResponseError
65
66 _faults = {
67 "LimitExceededException": exceptions.LimitExceededException,
68 "ResourceConflictException": exceptions.ResourceConflictException,
69 "DeveloperUserAlreadyRegisteredException": exceptions.DeveloperUserAlreadyRegisteredException,
70 "TooManyRequestsException": exceptions.TooManyRequestsException,
71 "InvalidParameterException": exceptions.InvalidParameterException,
72 "ResourceNotFoundException": exceptions.ResourceNotFoundException,
73 "InternalErrorException": exceptions.InternalErrorException,
74 "NotAuthorizedException": exceptions.NotAuthorizedException,
75 }
76
77
78 def __init__(self, **kwargs):
79 region = kwargs.pop('region', None)
80 if not region:
81 region = RegionInfo(self, self.DefaultRegionName,
82 self.DefaultRegionEndpoint)
83
84 if 'host' not in kwargs or kwargs['host'] is None:
85 kwargs['host'] = region.endpoint
86
87 super(CognitoIdentityConnection, self).__init__(**kwargs)
88 self.region = region
89
90 def _required_auth_capability(self):
91 return ['hmac-v4']
92
93 def create_identity_pool(self, identity_pool_name,
94 allow_unauthenticated_identities,
95 supported_login_providers=None,
96 developer_provider_name=None,
97 open_id_connect_provider_ar_ns=None):
98 """
99 Creates a new identity pool. The identity pool is a store of
100 user identity information that is specific to your AWS
101 account. The limit on identity pools is 60 per account.
102
103 :type identity_pool_name: string
104 :param identity_pool_name: A string that you provide.
105
106 :type allow_unauthenticated_identities: boolean
107 :param allow_unauthenticated_identities: TRUE if the identity pool
108 supports unauthenticated logins.
109
110 :type supported_login_providers: map
111 :param supported_login_providers: Optional key:value pairs mapping
112 provider names to provider app IDs.
113
114 :type developer_provider_name: string
115 :param developer_provider_name: The "domain" by which Cognito will
116 refer to your users. This name acts as a placeholder that allows
117 your backend and the Cognito service to communicate about the
118 developer provider. For the `DeveloperProviderName`, you can use
119 letters as well as period ( `.`), underscore ( `_`), and dash (
120 `-`).
121 Once you have set a developer provider name, you cannot change it.
122 Please take care in setting this parameter.
123
124 :type open_id_connect_provider_ar_ns: list
125 :param open_id_connect_provider_ar_ns:
126
127 """
128 params = {
129 'IdentityPoolName': identity_pool_name,
130 'AllowUnauthenticatedIdentities': allow_unauthenticated_identities,
131 }
132 if supported_login_providers is not None:
133 params['SupportedLoginProviders'] = supported_login_providers
134 if developer_provider_name is not None:
135 params['DeveloperProviderName'] = developer_provider_name
136 if open_id_connect_provider_ar_ns is not None:
137 params['OpenIdConnectProviderARNs'] = open_id_connect_provider_ar_ns
138 return self.make_request(action='CreateIdentityPool',
139 body=json.dumps(params))
140
141 def delete_identity_pool(self, identity_pool_id):
142 """
143 Deletes a user pool. Once a pool is deleted, users will not be
144 able to authenticate with the pool.
145
146 :type identity_pool_id: string
147 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
148
149 """
150 params = {'IdentityPoolId': identity_pool_id, }
151 return self.make_request(action='DeleteIdentityPool',
152 body=json.dumps(params))
153
154 def describe_identity_pool(self, identity_pool_id):
155 """
156 Gets details about a particular identity pool, including the
157 pool name, ID description, creation date, and current number
158 of users.
159
160 :type identity_pool_id: string
161 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
162
163 """
164 params = {'IdentityPoolId': identity_pool_id, }
165 return self.make_request(action='DescribeIdentityPool',
166 body=json.dumps(params))
167
168 def get_id(self, account_id, identity_pool_id, logins=None):
169 """
170 Generates (or retrieves) a Cognito ID. Supplying multiple
171 logins will create an implicit linked account.
172
173 :type account_id: string
174 :param account_id: A standard AWS account ID (9+ digits).
175
176 :type identity_pool_id: string
177 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
178
179 :type logins: map
180 :param logins: A set of optional name-value pairs that map provider
181 names to provider tokens.
182 The available provider names for `Logins` are as follows:
183
184 + Facebook: `graph.facebook.com`
185 + Google: `accounts.google.com`
186 + Amazon: `www.amazon.com`
187
188 """
189 params = {
190 'AccountId': account_id,
191 'IdentityPoolId': identity_pool_id,
192 }
193 if logins is not None:
194 params['Logins'] = logins
195 return self.make_request(action='GetId',
196 body=json.dumps(params))
197
198 def get_open_id_token(self, identity_id, logins=None):
199 """
200 Gets an OpenID token, using a known Cognito ID. This known
201 Cognito ID is returned by GetId. You can optionally add
202 additional logins for the identity. Supplying multiple logins
203 creates an implicit link.
204
205 The OpenId token is valid for 15 minutes.
206
207 :type identity_id: string
208 :param identity_id: A unique identifier in the format REGION:GUID.
209
210 :type logins: map
211 :param logins: A set of optional name-value pairs that map provider
212 names to provider tokens.
213
214 """
215 params = {'IdentityId': identity_id, }
216 if logins is not None:
217 params['Logins'] = logins
218 return self.make_request(action='GetOpenIdToken',
219 body=json.dumps(params))
220
221 def get_open_id_token_for_developer_identity(self, identity_pool_id,
222 logins, identity_id=None,
223 token_duration=None):
224 """
225 Registers (or retrieves) a Cognito `IdentityId` and an OpenID
226 Connect token for a user authenticated by your backend
227 authentication process. Supplying multiple logins will create
228 an implicit linked account. You can only specify one developer
229 provider as part of the `Logins` map, which is linked to the
230 identity pool. The developer provider is the "domain" by which
231 Cognito will refer to your users.
232
233 You can use `GetOpenIdTokenForDeveloperIdentity` to create a
234 new identity and to link new logins (that is, user credentials
235 issued by a public provider or developer provider) to an
236 existing identity. When you want to create a new identity, the
237 `IdentityId` should be null. When you want to associate a new
238 login with an existing authenticated/unauthenticated identity,
239 you can do so by providing the existing `IdentityId`. This API
240 will create the identity in the specified `IdentityPoolId`.
241
242 :type identity_pool_id: string
243 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
244
245 :type identity_id: string
246 :param identity_id: A unique identifier in the format REGION:GUID.
247
248 :type logins: map
249 :param logins: A set of optional name-value pairs that map provider
250 names to provider tokens. Each name-value pair represents a user
251 from a public provider or developer provider. If the user is from a
252 developer provider, the name-value pair will follow the syntax
253 `"developer_provider_name": "developer_user_identifier"`. The
254 developer provider is the "domain" by which Cognito will refer to
255 your users; you provided this domain while creating/updating the
256 identity pool. The developer user identifier is an identifier from
257 your backend that uniquely identifies a user. When you create an
258 identity pool, you can specify the supported logins.
259
260 :type token_duration: long
261 :param token_duration: The expiration time of the token, in seconds.
262 You can specify a custom expiration time for the token so that you
263 can cache it. If you don't provide an expiration time, the token is
264 valid for 15 minutes. You can exchange the token with Amazon STS
265 for temporary AWS credentials, which are valid for a maximum of one
266 hour. The maximum token duration you can set is 24 hours. You
267 should take care in setting the expiration time for a token, as
268 there are significant security implications: an attacker could use
269 a leaked token to access your AWS resources for the token's
270 duration.
271
272 """
273 params = {
274 'IdentityPoolId': identity_pool_id,
275 'Logins': logins,
276 }
277 if identity_id is not None:
278 params['IdentityId'] = identity_id
279 if token_duration is not None:
280 params['TokenDuration'] = token_duration
281 return self.make_request(action='GetOpenIdTokenForDeveloperIdentity',
282 body=json.dumps(params))
283
284 def list_identities(self, identity_pool_id, max_results, next_token=None):
285 """
286 Lists the identities in a pool.
287
288 :type identity_pool_id: string
289 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
290
291 :type max_results: integer
292 :param max_results: The maximum number of identities to return.
293
294 :type next_token: string
295 :param next_token: A pagination token.
296
297 """
298 params = {
299 'IdentityPoolId': identity_pool_id,
300 'MaxResults': max_results,
301 }
302 if next_token is not None:
303 params['NextToken'] = next_token
304 return self.make_request(action='ListIdentities',
305 body=json.dumps(params))
306
307 def list_identity_pools(self, max_results, next_token=None):
308 """
309 Lists all of the Cognito identity pools registered for your
310 account.
311
312 :type max_results: integer
313 :param max_results: The maximum number of identities to return.
314
315 :type next_token: string
316 :param next_token: A pagination token.
317
318 """
319 params = {'MaxResults': max_results, }
320 if next_token is not None:
321 params['NextToken'] = next_token
322 return self.make_request(action='ListIdentityPools',
323 body=json.dumps(params))
324
325 def lookup_developer_identity(self, identity_pool_id, identity_id=None,
326 developer_user_identifier=None,
327 max_results=None, next_token=None):
328 """
329 Retrieves the `IdentityID` associated with a
330 `DeveloperUserIdentifier` or the list of
331 `DeveloperUserIdentifier`s associated with an `IdentityId` for
332 an existing identity. Either `IdentityID` or
333 `DeveloperUserIdentifier` must not be null. If you supply only
334 one of these values, the other value will be searched in the
335 database and returned as a part of the response. If you supply
336 both, `DeveloperUserIdentifier` will be matched against
337 `IdentityID`. If the values are verified against the database,
338 the response returns both values and is the same as the
339 request. Otherwise a `ResourceConflictException` is thrown.
340
341 :type identity_pool_id: string
342 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
343
344 :type identity_id: string
345 :param identity_id: A unique identifier in the format REGION:GUID.
346
347 :type developer_user_identifier: string
348 :param developer_user_identifier: A unique ID used by your backend
349 authentication process to identify a user. Typically, a developer
350 identity provider would issue many developer user identifiers, in
351 keeping with the number of users.
352
353 :type max_results: integer
354 :param max_results: The maximum number of identities to return.
355
356 :type next_token: string
357 :param next_token: A pagination token. The first call you make will
358 have `NextToken` set to null. After that the service will return
359 `NextToken` values as needed. For example, let's say you make a
360 request with `MaxResults` set to 10, and there are 20 matches in
361 the database. The service will return a pagination token as a part
362 of the response. This token can be used to call the API again and
363 get results starting from the 11th match.
364
365 """
366 params = {'IdentityPoolId': identity_pool_id, }
367 if identity_id is not None:
368 params['IdentityId'] = identity_id
369 if developer_user_identifier is not None:
370 params['DeveloperUserIdentifier'] = developer_user_identifier
371 if max_results is not None:
372 params['MaxResults'] = max_results
373 if next_token is not None:
374 params['NextToken'] = next_token
375 return self.make_request(action='LookupDeveloperIdentity',
376 body=json.dumps(params))
377
378 def merge_developer_identities(self, source_user_identifier,
379 destination_user_identifier,
380 developer_provider_name, identity_pool_id):
381 """
382 Merges two users having different `IdentityId`s, existing in
383 the same identity pool, and identified by the same developer
384 provider. You can use this action to request that discrete
385 users be merged and identified as a single user in the Cognito
386 environment. Cognito associates the given source user (
387 `SourceUserIdentifier`) with the `IdentityId` of the
388 `DestinationUserIdentifier`. Only developer-authenticated
389 users can be merged. If the users to be merged are associated
390 with the same public provider, but as two different users, an
391 exception will be thrown.
392
393 :type source_user_identifier: string
394 :param source_user_identifier: User identifier for the source user. The
395 value should be a `DeveloperUserIdentifier`.
396
397 :type destination_user_identifier: string
398 :param destination_user_identifier: User identifier for the destination
399 user. The value should be a `DeveloperUserIdentifier`.
400
401 :type developer_provider_name: string
402 :param developer_provider_name: The "domain" by which Cognito will
403 refer to your users. This is a (pseudo) domain name that you
404 provide while creating an identity pool. This name acts as a
405 placeholder that allows your backend and the Cognito service to
406 communicate about the developer provider. For the
407 `DeveloperProviderName`, you can use letters as well as period (.),
408 underscore (_), and dash (-).
409
410 :type identity_pool_id: string
411 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
412
413 """
414 params = {
415 'SourceUserIdentifier': source_user_identifier,
416 'DestinationUserIdentifier': destination_user_identifier,
417 'DeveloperProviderName': developer_provider_name,
418 'IdentityPoolId': identity_pool_id,
419 }
420 return self.make_request(action='MergeDeveloperIdentities',
421 body=json.dumps(params))
422
423 def unlink_developer_identity(self, identity_id, identity_pool_id,
424 developer_provider_name,
425 developer_user_identifier):
426 """
427 Unlinks a `DeveloperUserIdentifier` from an existing identity.
428 Unlinked developer users will be considered new identities
429 next time they are seen. If, for a given Cognito identity, you
430 remove all federated identities as well as the developer user
431 identifier, the Cognito identity becomes inaccessible.
432
433 :type identity_id: string
434 :param identity_id: A unique identifier in the format REGION:GUID.
435
436 :type identity_pool_id: string
437 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
438
439 :type developer_provider_name: string
440 :param developer_provider_name: The "domain" by which Cognito will
441 refer to your users.
442
443 :type developer_user_identifier: string
444 :param developer_user_identifier: A unique ID used by your backend
445 authentication process to identify a user.
446
447 """
448 params = {
449 'IdentityId': identity_id,
450 'IdentityPoolId': identity_pool_id,
451 'DeveloperProviderName': developer_provider_name,
452 'DeveloperUserIdentifier': developer_user_identifier,
453 }
454 return self.make_request(action='UnlinkDeveloperIdentity',
455 body=json.dumps(params))
456
457 def unlink_identity(self, identity_id, logins, logins_to_remove):
458 """
459 Unlinks a federated identity from an existing account.
460 Unlinked logins will be considered new identities next time
461 they are seen. Removing the last linked login will make this
462 identity inaccessible.
463
464 :type identity_id: string
465 :param identity_id: A unique identifier in the format REGION:GUID.
466
467 :type logins: map
468 :param logins: A set of optional name-value pairs that map provider
469 names to provider tokens.
470
471 :type logins_to_remove: list
472 :param logins_to_remove: Provider names to unlink from this identity.
473
474 """
475 params = {
476 'IdentityId': identity_id,
477 'Logins': logins,
478 'LoginsToRemove': logins_to_remove,
479 }
480 return self.make_request(action='UnlinkIdentity',
481 body=json.dumps(params))
482
483 def update_identity_pool(self, identity_pool_id, identity_pool_name,
484 allow_unauthenticated_identities,
485 supported_login_providers=None,
486 developer_provider_name=None,
487 open_id_connect_provider_ar_ns=None):
488 """
489 Updates a user pool.
490
491 :type identity_pool_id: string
492 :param identity_pool_id: An identity pool ID in the format REGION:GUID.
493
494 :type identity_pool_name: string
495 :param identity_pool_name: A string that you provide.
496
497 :type allow_unauthenticated_identities: boolean
498 :param allow_unauthenticated_identities: TRUE if the identity pool
499 supports unauthenticated logins.
500
501 :type supported_login_providers: map
502 :param supported_login_providers: Optional key:value pairs mapping
503 provider names to provider app IDs.
504
505 :type developer_provider_name: string
506 :param developer_provider_name: The "domain" by which Cognito will
507 refer to your users.
508
509 :type open_id_connect_provider_ar_ns: list
510 :param open_id_connect_provider_ar_ns:
511
512 """
513 params = {
514 'IdentityPoolId': identity_pool_id,
515 'IdentityPoolName': identity_pool_name,
516 'AllowUnauthenticatedIdentities': allow_unauthenticated_identities,
517 }
518 if supported_login_providers is not None:
519 params['SupportedLoginProviders'] = supported_login_providers
520 if developer_provider_name is not None:
521 params['DeveloperProviderName'] = developer_provider_name
522 if open_id_connect_provider_ar_ns is not None:
523 params['OpenIdConnectProviderARNs'] = open_id_connect_provider_ar_ns
524 return self.make_request(action='UpdateIdentityPool',
525 body=json.dumps(params))
526
527 def make_request(self, action, body):
528 headers = {
529 'X-Amz-Target': '%s.%s' % (self.TargetPrefix, action),
530 'Host': self.region.endpoint,
531 'Content-Type': 'application/x-amz-json-1.1',
532 'Content-Length': str(len(body)),
533 }
534 http_request = self.build_base_http_request(
535 method='POST', path='/', auth_path='/', params={},
536 headers=headers, data=body)
537 response = self._mexe(http_request, sender=None,
538 override_num_retries=10)
539 response_body = response.read().decode('utf-8')
540 boto.log.debug(response_body)
541 if response.status == 200:
542 if response_body:
543 return json.loads(response_body)
544 else:
545 json_body = json.loads(response_body)
546 fault_name = json_body.get('__type', None)
547 exception_class = self._faults.get(fault_name, self.ResponseError)
548 raise exception_class(response.status, response.reason,
549 body=json_body)