Вот краткое изложение того, что я реализовал на данный момент:
Я определил конечные точки для регистрации и входа в GitHub в своем файле Endpoint.kt.
Я настроил методы API в MyApi для обработки запросов на регистрацию и вход в GitHub.
/>Мой класс AuthRepositoryImpl содержит функции для регистрации и входа в GitHub.
У меня есть класс GitHubModel, который обрабатывает взаимодействие с пользователем и инициирует процесс аутентификации GitHub.
Вот фрагмент соответствующего кода: р>
Код: Выделить всё
// Endpoint.kt
sealed class Endpoint(val route: String, private val customBaseUrl: String? = null) {
private val baseUrl = "https://development.mentorlst.com/"
val url: String
get() =
buildString {
append(baseUrl)
append(route)
}
object Auth {
object GithubSignIn : Endpoint(route = "auth/login/github")
object GithubSignUp : Endpoint(route = "auth/register/github")
}
my api
class MyApi
@Inject
constructor(val client: HttpClient) {
suspend fun githubSignUp(
request: GithubSignUpRequestDTO,
// ClientID: String,
// ClientSecret: String,
): NetworkResult =
safeApiCall {
client.post(urlString = Endpoint.Auth.GithubSignUp.url)
}
suspend fun githubSignIn(request: GithubSignInRequestDTO): NetworkResult =
safeApiCall {
client.post(urlString = Endpoint.Auth.GithubSignIn.url) {
setBody(request)
}
}
}
Myrepository
class AuthRepositoryImpl(
val api: MytApi,
val remotePreference: RemotePreference,
val localPreference: LocalPreference
) : AuthRepository {
override suspend fun signUpWithGithub(code: String): DataResult {
return when (val response = api.githubSignUp(request = GithubSignUpRequestDTO(code))){
is NetworkResult.Error -> {
DataResult.Error(message = response.message)
}
is NetworkResult.Success -> {
val data = response.data
handleResponse(
access = data.accessToken,
refresh = data.refreshToken,
entity = data.toEntity()
)
DataResult.Success(data = "Welcome ${data.fullName}")
}
}
}
override suspend fun signInWithGithub(code: String): DataResult {
return when (val response = api.githubSignIn(request = GithubSignInRequestDTO(code))) {
is NetworkResult.Error -> {
DataResult.Error(message = response.message)
}
is NetworkResult.Success -> {
val data = response.data
handleResponse(
access = data.accessToken,
refresh = data.refreshToken,
entity = data.toEntity()
)
DataResult.Success(data = "You have successfully signed up")
}
}
}
@Serializable
data class GithubSignUpRequestDTO(
@Serializable
val code: String,
)
@Serializable
data class GithubSignUpResponseDTO(
val accessToken: String,
val authProviderType: String,
val fullName: String,
val menteeProfile: String,
val mentorProfile: String,
val profilePicture: String,
val refreshToken: String,
val timeZone: String,
) {
companion object {
val RESPONSE =
"""
{
"accessToken": "string",
"refreshToken": "string",
"authProviderType": "string",
"mentorProfile": "string",
"menteeProfile": "string",
"profilePicture": "string",
"fullName": "string" "timeZone": "string"
}
""".trimIndent()
class GitHubModel
@Inject
constructor(
val repository: AuthRepository,
) : MutableScreenModel(GithubState()) {
private fun showLoading() {
updateState { copy(isLoading = true) }
}
private fun hideLoading() {
updateState { copy(isLoading = false) }
}
fun onGithubClicked(context: Context) {
coroutineScope.launch {
showLoading()
val code = state.value.code ?: ""
val response = repository.signInWithGithub(code)
val authUrl = Endpoint.Auth.GithubSignIn.url
val clientId = "aa84d7f6e47ad98754a1"
val clientSecret = "6101c1c5a4803e9f68e5a31ca4b5743f22e7acdd"
val authUrlWithParams = "$authUrl?client_id=$clientId&client_secret=$clientSecret&code=$code"
openBrowser(context, authUrl)
hideLoading()
when (response) {
is DataResult.Error -> {
updateState { copy(authenticationError = response.message) }
}
is DataResult.Success -> {
updateState { copy(navigateToProfile = true) }
}
else -> {}
}
}
}
fun clearError() {
updateState { copy(authenticationError = null) }
}
private fun openBrowser(
context: Context,
authUrl: String,
) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))
context.startActivity(intent)
}
}
Однако я не уверен, как правильно обрабатывать этот процесс навигации. В настоящее время при нажатии кнопки GitHub я открываю окно браузера, используя намерение, но не знаю, как обрабатывать перенаправление обратно в мое приложение после авторизации.
Может кто-нибудь предоставит рекомендации о том, как правильно реализовать этот процесс навигации для регистрации и входа в систему с помощью GitHub в приложении Android?
Подробнее здесь: https://stackoverflow.com/questions/781 ... in-feature
Мобильная версия