{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CognitoIdentity.GetOpenIdToken
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Gets an OpenID token, using a known Cognito ID. This known Cognito ID is
-- returned by GetId. You can optionally add additional logins for the
-- identity. Supplying multiple logins creates an implicit link.
--
-- The OpenID token is valid for 10 minutes.
--
-- This is a public API. You do not need any credentials to call this API.
module Amazonka.CognitoIdentity.GetOpenIdToken
  ( -- * Creating a Request
    GetOpenIdToken (..),
    newGetOpenIdToken,

    -- * Request Lenses
    getOpenIdToken_logins,
    getOpenIdToken_identityId,

    -- * Destructuring the Response
    GetOpenIdTokenResponse (..),
    newGetOpenIdTokenResponse,

    -- * Response Lenses
    getOpenIdTokenResponse_identityId,
    getOpenIdTokenResponse_token,
    getOpenIdTokenResponse_httpStatus,
  )
where

import Amazonka.CognitoIdentity.Types
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | Input to the GetOpenIdToken action.
--
-- /See:/ 'newGetOpenIdToken' smart constructor.
data GetOpenIdToken = GetOpenIdToken'
  { -- | A set of optional name-value pairs that map provider names to provider
    -- tokens. When using graph.facebook.com and www.amazon.com, supply the
    -- access_token returned from the provider\'s authflow. For
    -- accounts.google.com, an Amazon Cognito user pool provider, or any other
    -- OpenID Connect provider, always include the @id_token@.
    GetOpenIdToken -> Maybe (HashMap Text Text)
logins :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | A unique identifier in the format REGION:GUID.
    GetOpenIdToken -> Text
identityId :: Prelude.Text
  }
  deriving (GetOpenIdToken -> GetOpenIdToken -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetOpenIdToken -> GetOpenIdToken -> Bool
$c/= :: GetOpenIdToken -> GetOpenIdToken -> Bool
== :: GetOpenIdToken -> GetOpenIdToken -> Bool
$c== :: GetOpenIdToken -> GetOpenIdToken -> Bool
Prelude.Eq, ReadPrec [GetOpenIdToken]
ReadPrec GetOpenIdToken
Int -> ReadS GetOpenIdToken
ReadS [GetOpenIdToken]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetOpenIdToken]
$creadListPrec :: ReadPrec [GetOpenIdToken]
readPrec :: ReadPrec GetOpenIdToken
$creadPrec :: ReadPrec GetOpenIdToken
readList :: ReadS [GetOpenIdToken]
$creadList :: ReadS [GetOpenIdToken]
readsPrec :: Int -> ReadS GetOpenIdToken
$creadsPrec :: Int -> ReadS GetOpenIdToken
Prelude.Read, Int -> GetOpenIdToken -> ShowS
[GetOpenIdToken] -> ShowS
GetOpenIdToken -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetOpenIdToken] -> ShowS
$cshowList :: [GetOpenIdToken] -> ShowS
show :: GetOpenIdToken -> String
$cshow :: GetOpenIdToken -> String
showsPrec :: Int -> GetOpenIdToken -> ShowS
$cshowsPrec :: Int -> GetOpenIdToken -> ShowS
Prelude.Show, forall x. Rep GetOpenIdToken x -> GetOpenIdToken
forall x. GetOpenIdToken -> Rep GetOpenIdToken x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetOpenIdToken x -> GetOpenIdToken
$cfrom :: forall x. GetOpenIdToken -> Rep GetOpenIdToken x
Prelude.Generic)

-- |
-- Create a value of 'GetOpenIdToken' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'logins', 'getOpenIdToken_logins' - A set of optional name-value pairs that map provider names to provider
-- tokens. When using graph.facebook.com and www.amazon.com, supply the
-- access_token returned from the provider\'s authflow. For
-- accounts.google.com, an Amazon Cognito user pool provider, or any other
-- OpenID Connect provider, always include the @id_token@.
--
-- 'identityId', 'getOpenIdToken_identityId' - A unique identifier in the format REGION:GUID.
newGetOpenIdToken ::
  -- | 'identityId'
  Prelude.Text ->
  GetOpenIdToken
newGetOpenIdToken :: Text -> GetOpenIdToken
newGetOpenIdToken Text
pIdentityId_ =
  GetOpenIdToken'
    { $sel:logins:GetOpenIdToken' :: Maybe (HashMap Text Text)
logins = forall a. Maybe a
Prelude.Nothing,
      $sel:identityId:GetOpenIdToken' :: Text
identityId = Text
pIdentityId_
    }

-- | A set of optional name-value pairs that map provider names to provider
-- tokens. When using graph.facebook.com and www.amazon.com, supply the
-- access_token returned from the provider\'s authflow. For
-- accounts.google.com, an Amazon Cognito user pool provider, or any other
-- OpenID Connect provider, always include the @id_token@.
getOpenIdToken_logins :: Lens.Lens' GetOpenIdToken (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
getOpenIdToken_logins :: Lens' GetOpenIdToken (Maybe (HashMap Text Text))
getOpenIdToken_logins = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetOpenIdToken' {Maybe (HashMap Text Text)
logins :: Maybe (HashMap Text Text)
$sel:logins:GetOpenIdToken' :: GetOpenIdToken -> Maybe (HashMap Text Text)
logins} -> Maybe (HashMap Text Text)
logins) (\s :: GetOpenIdToken
s@GetOpenIdToken' {} Maybe (HashMap Text Text)
a -> GetOpenIdToken
s {$sel:logins:GetOpenIdToken' :: Maybe (HashMap Text Text)
logins = Maybe (HashMap Text Text)
a} :: GetOpenIdToken) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | A unique identifier in the format REGION:GUID.
getOpenIdToken_identityId :: Lens.Lens' GetOpenIdToken Prelude.Text
getOpenIdToken_identityId :: Lens' GetOpenIdToken Text
getOpenIdToken_identityId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetOpenIdToken' {Text
identityId :: Text
$sel:identityId:GetOpenIdToken' :: GetOpenIdToken -> Text
identityId} -> Text
identityId) (\s :: GetOpenIdToken
s@GetOpenIdToken' {} Text
a -> GetOpenIdToken
s {$sel:identityId:GetOpenIdToken' :: Text
identityId = Text
a} :: GetOpenIdToken)

instance Core.AWSRequest GetOpenIdToken where
  type
    AWSResponse GetOpenIdToken =
      GetOpenIdTokenResponse
  request :: (Service -> Service) -> GetOpenIdToken -> Request GetOpenIdToken
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy GetOpenIdToken
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse GetOpenIdToken)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe Text -> Maybe Text -> Int -> GetOpenIdTokenResponse
GetOpenIdTokenResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"IdentityId")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"Token")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable GetOpenIdToken where
  hashWithSalt :: Int -> GetOpenIdToken -> Int
hashWithSalt Int
_salt GetOpenIdToken' {Maybe (HashMap Text Text)
Text
identityId :: Text
logins :: Maybe (HashMap Text Text)
$sel:identityId:GetOpenIdToken' :: GetOpenIdToken -> Text
$sel:logins:GetOpenIdToken' :: GetOpenIdToken -> Maybe (HashMap Text Text)
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (HashMap Text Text)
logins
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
identityId

instance Prelude.NFData GetOpenIdToken where
  rnf :: GetOpenIdToken -> ()
rnf GetOpenIdToken' {Maybe (HashMap Text Text)
Text
identityId :: Text
logins :: Maybe (HashMap Text Text)
$sel:identityId:GetOpenIdToken' :: GetOpenIdToken -> Text
$sel:logins:GetOpenIdToken' :: GetOpenIdToken -> Maybe (HashMap Text Text)
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe (HashMap Text Text)
logins
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
identityId

instance Data.ToHeaders GetOpenIdToken where
  toHeaders :: GetOpenIdToken -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"AWSCognitoIdentityService.GetOpenIdToken" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON GetOpenIdToken where
  toJSON :: GetOpenIdToken -> Value
toJSON GetOpenIdToken' {Maybe (HashMap Text Text)
Text
identityId :: Text
logins :: Maybe (HashMap Text Text)
$sel:identityId:GetOpenIdToken' :: GetOpenIdToken -> Text
$sel:logins:GetOpenIdToken' :: GetOpenIdToken -> Maybe (HashMap Text Text)
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Logins" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe (HashMap Text Text)
logins,
            forall a. a -> Maybe a
Prelude.Just (Key
"IdentityId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
identityId)
          ]
      )

instance Data.ToPath GetOpenIdToken where
  toPath :: GetOpenIdToken -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery GetOpenIdToken where
  toQuery :: GetOpenIdToken -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | Returned in response to a successful GetOpenIdToken request.
--
-- /See:/ 'newGetOpenIdTokenResponse' smart constructor.
data GetOpenIdTokenResponse = GetOpenIdTokenResponse'
  { -- | A unique identifier in the format REGION:GUID. Note that the IdentityId
    -- returned may not match the one passed on input.
    GetOpenIdTokenResponse -> Maybe Text
identityId :: Prelude.Maybe Prelude.Text,
    -- | An OpenID token, valid for 10 minutes.
    GetOpenIdTokenResponse -> Maybe Text
token :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    GetOpenIdTokenResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (GetOpenIdTokenResponse -> GetOpenIdTokenResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetOpenIdTokenResponse -> GetOpenIdTokenResponse -> Bool
$c/= :: GetOpenIdTokenResponse -> GetOpenIdTokenResponse -> Bool
== :: GetOpenIdTokenResponse -> GetOpenIdTokenResponse -> Bool
$c== :: GetOpenIdTokenResponse -> GetOpenIdTokenResponse -> Bool
Prelude.Eq, ReadPrec [GetOpenIdTokenResponse]
ReadPrec GetOpenIdTokenResponse
Int -> ReadS GetOpenIdTokenResponse
ReadS [GetOpenIdTokenResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetOpenIdTokenResponse]
$creadListPrec :: ReadPrec [GetOpenIdTokenResponse]
readPrec :: ReadPrec GetOpenIdTokenResponse
$creadPrec :: ReadPrec GetOpenIdTokenResponse
readList :: ReadS [GetOpenIdTokenResponse]
$creadList :: ReadS [GetOpenIdTokenResponse]
readsPrec :: Int -> ReadS GetOpenIdTokenResponse
$creadsPrec :: Int -> ReadS GetOpenIdTokenResponse
Prelude.Read, Int -> GetOpenIdTokenResponse -> ShowS
[GetOpenIdTokenResponse] -> ShowS
GetOpenIdTokenResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetOpenIdTokenResponse] -> ShowS
$cshowList :: [GetOpenIdTokenResponse] -> ShowS
show :: GetOpenIdTokenResponse -> String
$cshow :: GetOpenIdTokenResponse -> String
showsPrec :: Int -> GetOpenIdTokenResponse -> ShowS
$cshowsPrec :: Int -> GetOpenIdTokenResponse -> ShowS
Prelude.Show, forall x. Rep GetOpenIdTokenResponse x -> GetOpenIdTokenResponse
forall x. GetOpenIdTokenResponse -> Rep GetOpenIdTokenResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetOpenIdTokenResponse x -> GetOpenIdTokenResponse
$cfrom :: forall x. GetOpenIdTokenResponse -> Rep GetOpenIdTokenResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetOpenIdTokenResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'identityId', 'getOpenIdTokenResponse_identityId' - A unique identifier in the format REGION:GUID. Note that the IdentityId
-- returned may not match the one passed on input.
--
-- 'token', 'getOpenIdTokenResponse_token' - An OpenID token, valid for 10 minutes.
--
-- 'httpStatus', 'getOpenIdTokenResponse_httpStatus' - The response's http status code.
newGetOpenIdTokenResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GetOpenIdTokenResponse
newGetOpenIdTokenResponse :: Int -> GetOpenIdTokenResponse
newGetOpenIdTokenResponse Int
pHttpStatus_ =
  GetOpenIdTokenResponse'
    { $sel:identityId:GetOpenIdTokenResponse' :: Maybe Text
identityId =
        forall a. Maybe a
Prelude.Nothing,
      $sel:token:GetOpenIdTokenResponse' :: Maybe Text
token = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GetOpenIdTokenResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | A unique identifier in the format REGION:GUID. Note that the IdentityId
-- returned may not match the one passed on input.
getOpenIdTokenResponse_identityId :: Lens.Lens' GetOpenIdTokenResponse (Prelude.Maybe Prelude.Text)
getOpenIdTokenResponse_identityId :: Lens' GetOpenIdTokenResponse (Maybe Text)
getOpenIdTokenResponse_identityId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetOpenIdTokenResponse' {Maybe Text
identityId :: Maybe Text
$sel:identityId:GetOpenIdTokenResponse' :: GetOpenIdTokenResponse -> Maybe Text
identityId} -> Maybe Text
identityId) (\s :: GetOpenIdTokenResponse
s@GetOpenIdTokenResponse' {} Maybe Text
a -> GetOpenIdTokenResponse
s {$sel:identityId:GetOpenIdTokenResponse' :: Maybe Text
identityId = Maybe Text
a} :: GetOpenIdTokenResponse)

-- | An OpenID token, valid for 10 minutes.
getOpenIdTokenResponse_token :: Lens.Lens' GetOpenIdTokenResponse (Prelude.Maybe Prelude.Text)
getOpenIdTokenResponse_token :: Lens' GetOpenIdTokenResponse (Maybe Text)
getOpenIdTokenResponse_token = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetOpenIdTokenResponse' {Maybe Text
token :: Maybe Text
$sel:token:GetOpenIdTokenResponse' :: GetOpenIdTokenResponse -> Maybe Text
token} -> Maybe Text
token) (\s :: GetOpenIdTokenResponse
s@GetOpenIdTokenResponse' {} Maybe Text
a -> GetOpenIdTokenResponse
s {$sel:token:GetOpenIdTokenResponse' :: Maybe Text
token = Maybe Text
a} :: GetOpenIdTokenResponse)

-- | The response's http status code.
getOpenIdTokenResponse_httpStatus :: Lens.Lens' GetOpenIdTokenResponse Prelude.Int
getOpenIdTokenResponse_httpStatus :: Lens' GetOpenIdTokenResponse Int
getOpenIdTokenResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetOpenIdTokenResponse' {Int
httpStatus :: Int
$sel:httpStatus:GetOpenIdTokenResponse' :: GetOpenIdTokenResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: GetOpenIdTokenResponse
s@GetOpenIdTokenResponse' {} Int
a -> GetOpenIdTokenResponse
s {$sel:httpStatus:GetOpenIdTokenResponse' :: Int
httpStatus = Int
a} :: GetOpenIdTokenResponse)

instance Prelude.NFData GetOpenIdTokenResponse where
  rnf :: GetOpenIdTokenResponse -> ()
rnf GetOpenIdTokenResponse' {Int
Maybe Text
httpStatus :: Int
token :: Maybe Text
identityId :: Maybe Text
$sel:httpStatus:GetOpenIdTokenResponse' :: GetOpenIdTokenResponse -> Int
$sel:token:GetOpenIdTokenResponse' :: GetOpenIdTokenResponse -> Maybe Text
$sel:identityId:GetOpenIdTokenResponse' :: GetOpenIdTokenResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
identityId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
token
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus