Android: авторизация GitHub в функции регистрации/входаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android: авторизация GitHub в функции регистрации/входа

Сообщение Anonymous »

В настоящее время я работаю над реализацией функции в своем приложении для Android, которая позволяет пользователям регистрироваться и входить в систему, используя свои учетные записи GitHub. Однако я столкнулся с некоторыми проблемами при переходе на страницу авторизации GitHub в окне браузера, а затем обратно в приложение после авторизации. Приложение выполняет переход в браузер, но получает сообщение об ошибке: конечная точка недоступна или сервер не работает.
Вот краткое изложение того, что я реализовал на данный момент:
Я определил конечные точки для регистрации и входа в 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 и разрешить моему приложению доступ к своим учетным данным. После авторизации я хочу вернуть пользователя в свое приложение.
Однако я не уверен, как правильно обрабатывать этот процесс навигации. В настоящее время при нажатии кнопки GitHub я открываю окно браузера, используя намерение, но не знаю, как обрабатывать перенаправление обратно в мое приложение после авторизации.
Может кто-нибудь предоставит рекомендации о том, как правильно реализовать этот процесс навигации для регистрации и входа в систему с помощью GitHub в приложении Android?

Подробнее здесь: https://stackoverflow.com/questions/781 ... in-feature
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»