gpt4 book ai didi

android - 如何在 Android 客户端中使用 Keycloak OpenId 进行 oAuth

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:08 24 4
gpt4 key购买 nike

我想在 Android 应用程序中使用 aerogear 和使用 Keycloak 的服务器对用户进行身份验证(使用他的用户名和密码)。我一直无法做到,请帮助我。

我目前可以在没有 aerogear 的情况下对用户进行身份验证,但我想使用这个库,因为它可以帮助我在需要时刷新 token 。我对像这样对服务器进行 POST 调用的用户进行身份验证(但来自 android):

 curl -X POST http://127.0.0.1:8080/auth/realms/example/protocol/openid-connect/token  
-H "Content-Type: application/x-www-form-urlencoded" -d "username=auser" -d 'password=apassword' -d 'grant_type=password'
-d 'client_id=clientId' -d 'client_secret=secret'

所以我得到的信息是:

  • 身份验证 URL,即 http://127.0.0.1:8080/auth/realms/example/protocol/openid-connect/token
  • username,用户的用户名
  • password,用户的密码
  • Keycloak服务器的client_id和client_secret

我对 Aerogear 的尝试是这样的:

private void authz() {
try {

AuthzModule authzModule = AuthorizationManager.config("KeyCloakAuthz", OAuth2AuthorizationConfiguration.class)
.setBaseURL(new URL("http://127.0.0.1:8080/"))
.setAuthzEndpoint("/realms/example/protocol/openid-connect/auth")
.setAccessTokenEndpoint("/realms/example/protocol/openid-connect/token")
.setAccountId("keycloak-token")
.setClientId("clientId")
.setClientSecret("secret")
.setRedirectURL("http://oauth2callback")
.setScopes(Arrays.asList("openid"))
.addAdditionalAuthorizationParam((Pair.create("grant_type", "password")))
.addAdditionalAuthorizationParam((Pair.create("username", "aUserName")))
.addAdditionalAuthorizationParam((Pair.create("password", "aPassword")))
.asModule();


authzModule.requestAccess(this, new Callback<String>() {
@Override
public void onSuccess(String o) {
Log.d("TOKEN ", o);
}

@Override
public void onFailure(Exception e) {
System.err.println("Error!!");
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
});

} catch (Exception e) {

e.printStackTrace();
throw new RuntimeException(e);
}
}

然而这并没有做任何事情。我不明白的是:

  1. 如何在 Aerogear 中指定我正在使用 Keycloak 进行 OpenID 连接?
  2. 如何以及在哪里可以发送用户名和密码?
  3. 如何指定 grant_type? (如果我不包含它,我到服务器的 HTTP POST 将不起作用,所以它很重要)

非常感谢任何帮助

最佳答案

如果您使用访问类型 = public client(无 clientSecret)的标准 Authorization Code 流程,那么您可以查看 my example Android native app .

简而言之,您可以在 WebView 中打开一个浏览器窗口,通过从返回的 url 中解析查询参数来获取 授权码 并交换它(代码) 通过 POST 请求获取 token 。

如果你使用 Retrofit,那么这里是 REST 接口(interface):

interface IKeycloakRest {
@POST("token")
@FormUrlEncoded
fun grantNewAccessToken(
@Field("code") code: String,
@Field("client_id") clientId: String,
@Field("redirect_uri") uri: String,
@Field("grant_type") grantType: String = "authorization_code"
): Observable<KeycloakToken>

@POST("token")
@FormUrlEncoded
fun refreshAccessToken(
@Field("refresh_token") refreshToken: String,
@Field("client_id") clientId: String,
@Field("grant_type") grantType: String = "refresh_token"
): Observable<KeycloakToken>

@POST("logout")
@FormUrlEncoded
fun logout(
@Field("client_id") clientId: String,
@Field("refresh_token") refreshToken: String
): Completable
}

data class KeycloakToken(
@SerializedName("access_token") var accessToken: String? = null,
@SerializedName("expires_in") var expiresIn: Int? = null,
@SerializedName("refresh_expires_in") var refreshExpiresIn: Int? = null,
@SerializedName("refresh_token") var refreshToken: String? = null
)

及其实例化:

val rest: IKeycloakRest = Retrofit.Builder()
.baseUrl("https://[KEYCLOAK-URL]/auth/realms/[REALM]/protocol/openid-connect/")
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(IKeycloakRest::class.java)

关于android - 如何在 Android 客户端中使用 Keycloak OpenId 进行 oAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39987419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com