Closed Orbyt closed 5 months ago
Hi @Orbyt thanks for posting your question!
There seems to be a bit of confusion here, I hope I can clarify. The short answer is that yes, it is definitely possible! The most straightforward way to access Cognito without using Amplify is to directly use the underlying AWS SDK for Kotlin - this is what Amplify itself uses to implement its Cognito functionality. There are some specific examples of using the Kotlin SDK to invoke Cognito APIs available here. The Kotlin SDK GitHub repository may be a good starting point for learning more.
Note that the Kotlin SDK is a lower-level library that is specifically useful for invoking AWS APIs, and Amplify builds on top of this to offer higher-level functionality such as storing credentials for you, or automatically refreshing tokens when required. If you use the Kotlin SDK directly you may need to implement some of this functionality yourself.
Moving on to Amplify, none of NPM/Typescript/Compose are strictly required to use Amplify to access Cognito. Here's what those technologies are used for:
npm
/typescript
: These are used in Amplify Gen2 to define your backend. Gen2 is built on Amazon CDK which is a type of infrastructure as code, so you define the AWS resources you need in TypeScript and then the Gen2 CLI can deploy everything in the cloud. It also outputs a configuration file that you add to your Android application (amplify_outputs.json
), which is what Amplify Android uses to connect to those resources. The only thing that goes into your application is the configuration file, TypeScript/NPM are only used to define the backend and is not part of your app. Although this is certainly the recommended way to set up your backend, you can still use the Gen1 CLI tool to setup Auth instead.compose
: Compose is only used by amplify-ui-android, which are UI components that you can use to build apps using Amplify (in the case of Cognito, it's the Authenticator component). Using Authenticator is strictly optional - you can absolutely choose to build your own UI instead and call through to Amplify Auth APIs to handle the Authentication. This is well covered in the Amplify Auth docs.Hope that answers your question, but let me know if something needs further clarification!
Hi don't know if this will answer your question but I found a repo with cognito and android and pretty sure its without amplify: https://github.com/nameisjayant/Aws-Cognito-User-Pool-Authnetication
Hi don't know if this will answer your question but I found a repo with cognito and android and pretty sure its without amplify: https://github.com/nameisjayant/Aws-Cognito-User-Pool-Authnetication
This app is using the AWS SDK for Android, which was the underlying AWS SDK for Amplify v1.x. Although this SDK can still be used, we recommend you either use Amplify (v2.x) or directly access the Kotlin SDK instead.
Hi @Orbyt thanks for posting your question!
There seems to be a bit of confusion here, I hope I can clarify. The short answer is that yes, it is definitely possible! The most straightforward way to access Cognito without using Amplify is to directly use the underlying AWS SDK for Kotlin - this is what Amplify itself uses to implement its Cognito functionality. There are some specific examples of using the Kotlin SDK to invoke Cognito APIs available here. The Kotlin SDK GitHub repository may be a good starting point for learning more.
Note that the Kotlin SDK is a lower-level library that is specifically useful for invoking AWS APIs, and Amplify builds on top of this to offer higher-level functionality such as storing credentials for you, or automatically refreshing tokens when required. If you use the Kotlin SDK directly you may need to implement some of this functionality yourself.
Moving on to Amplify, none of NPM/Typescript/Compose are strictly required to use Amplify to access Cognito. Here's what those technologies are used for:
* `npm`/`typescript`: These are used in Amplify Gen2 to define your backend. Gen2 is built on [Amazon CDK](https://docs.aws.amazon.com/cdk/v2/guide/home.html) which is a type of _infrastructure as code_, so you define the AWS resources you need in TypeScript and then the Gen2 CLI can deploy everything in the cloud. It also outputs a configuration file that you add to your Android application (`amplify_outputs.json`), which is what Amplify Android uses to connect to those resources. The only thing that goes into your application is the configuration file, TypeScript/NPM are only used to define the backend and is not part of your app. Although this is certainly the recommended way to set up your backend, you can still use the [Gen1 CLI tool to setup Auth](https://docs.amplify.aws/gen1/android/build-a-backend/auth/set-up-auth/) instead. * `compose`: Compose is only used by [amplify-ui-android](https://github.com/aws-amplify/amplify-ui-android/), which are UI components that you can use to build apps using Amplify (in the case of Cognito, it's the Authenticator component). Using Authenticator is strictly optional - you can absolutely choose to build your own UI instead and call through to Amplify Auth APIs to handle the Authentication. This is well covered in the [Amplify Auth docs](https://docs.amplify.aws/android/build-a-backend/auth/connect-your-frontend/sign-in/).
Hope that answers your question, but let me know if something needs further clarification!
@mattcreaser I cannot thank you enough for your well thought out response. I am still going through some of the documentation you linked, so I apologize for the delayed reply. You mentioned an amplify_outputs.json
file, which is also referenced in the official documentation, but I have not yet found an example of what that file actually looks like (I've also searched this repository) or how to configure it.
For context, the project that prompted this question is using AWS Cognito for user authentication. The React frontend for the project's associated web app is using the <Authenticator />
component, however I do not believe that the project is using an "Amplify backend". There is no amplify_outputs.json
file in the web project, and the button used to download that file as referenced in the documentation does not seem to be present.
Alternatively, there appears to be an Amplify.configure
function in the SDK, but I am unsure how to use without the aforementioned file. I did find some sort of schema for the amplify_outputs.json
in the documentation.
In summary, could you explain how to either go about obtaining an amplify_outputs.json
file when the project is not using an "Amplify backend", or how to configure the Amplify SDK in code?
K for Amplify v1.x. Although this SDK can still be used, we recommend you either use Amplify (v2.x) or directly access the Kotlin SDK instead.
Is there any fulll project examples with mvvm that use Kotlin SDK instead?
Is there any fulll project examples with mvvm that use Kotlin SDK instead?
I'm not aware of any such examples. The Kotlin SDK has a basic Android sample app but it's not MVVM. In general however I would recommend implementing your application as per clean architecture guidelines and use the Kotlin SDK at the repository layer if you wanted to go that route.
In summary, could you explain how to either go about obtaining an amplify_outputs.json file when the project is not using an "Amplify backend", or how to configure the Amplify SDK in code?
To connect to existing resources without setting up any Amplify cloud resources it's probably easier to use the older amplifyconfiguration.json
file format. You can copy/paste the JSON from the documentation page here and fill in your Cognito information.
You can omit the OAuth
object if you're only doing basic SRP auth.
To configure Amplify with this JSON data you have a couple of options:
<module>/src/res/raw/amplifyconfiguration.json
. Then you can call Amplify.configure(context)
and it will automatically read this file.AmplifyConfiguration
and pass it to the configure function: Amplify.configure(AmplifyConfiguration.fromJson(JSONObject(jsonString)), context)
.Hope that helps!
Is there any fulll project examples with mvvm that use Kotlin SDK instead?
I'm not aware of any such examples. The Kotlin SDK has a basic Android sample app but it's not MVVM. In general however I would recommend implementing your application as per clean architecture guidelines and use the Kotlin SDK at the repository layer if you wanted to go that route.
I was looking through the sample project but it was not related to cognito. Do you know where I can find a resource that talks about setting up the user pool and performing operations such as signing in and signing up etc with the kotlin sdk?
There are examples showing how to use the Kotlin SDK to perform various operations with Cognito here. It's for running on the JVM, not an Android application, but the code to use the Kotlin SDK is the same.
This issue is now closed. Comments on closed issues are hard for our team to see. If you need more assistance, please open a new issue that references this one.
Before opening, please confirm:
Language and Async Model
Kotlin or Java
Amplify Categories
Authentication
Gradle script dependencies
Not applicable.
Environment information
Not applicable.
Please include any relevant guides or documentation you're referencing
AWS Cognito SDK docs (https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-integrate-apps.html), Amplify docs, and more.
Describe the feature request
I have spent many hours reading documentation, searching Google, online forums, previous issues, and more, before posting here. Note that the "discussions" link for this project linked in the issues template (https://github.com/aws-amplify/amplify-android/discussions) returns a 404.
Documentation about using AWS Cognito without Amplify seem to be missing. The official AWS Cognito documentation almost exclusively references AWS Amplify. The part of that document referring to AWS Cognito SDKs for Java links to https://sdk.amazonaws.com/java/.../CognitoIdentityProviderClient, which then links to generic SDKs for AWS, none of which seem to be for accessing AWS Cognito in Android (the Java SDK appears to be for Java server applications).
Adding NPM/Typescript/Compose to access Cognito as required by the AWS Amplify for Android documentation is not viable for the project which prompted this question, and considering the multiple StackOverflow and Reddit threads on this topic this seems to be an issue for others as well. Is there any other way to simply authenticate a user in Android with AWS Cognito without making the entire application an "Amplify app"? Answers and documentation for such use-cases would be extremely helpful.
I am more than happy to add additional details to this query if needed. Thank you!
Initialization steps (if applicable)
No response
Code Snippet
No response
amplifyconfiguration.json
No response
GraphQL Schema
No response
Additional information and screenshots
No response