当前位置: 首页 > 知识库问答 >
问题:

令牌交换- Android Google Keycloak

裘臻
2023-03-14

背景:

我正在开发一款原生Android应用程序,通过Google SignIn验证,它正在运行。

我还有一个与Google集成的Keycloak服务器作为身份提供商,它也可以工作。

我可以导入我的帐户从谷歌在我的第一次登录,使用网络浏览器访问http://localhost:8080/auth/realms/chapa/account/.

当我进入Keycloak控制台时,我发现我的帐户已创建并与谷歌链接。

我的Google身份提供程序设置是使用(OpenId Connect v1https://accounts.google.com/.well-known/openid-configuration)或Keycloak上的Social Google完成的。

这两种方法都使用浏览器导航,因为我看到很少有人抱怨Keycloak插件坏了。

我的问题是:

在我的Android应用程序上,我无法使用Keycloak服务器执行Token Exchange。

我做了一个研究,这是集成Android Google Keycloak的唯一方法,因为我不想再问我的用户凭据。如果您知道其他方式,请告诉我。

在我的Keycloak服务器上,我得到的不是这个警告:

08:09:48,831 WARN [org.keycloak.events] (default task-11) type=TOKEN_EXCHANGE_ERROR, realmId=my-realm, clientId=android-app, userId=null, ipAddress=172.17.0.1, error=invalid_token, reason='user info call failure', auth_method=token_exchange, grant_type=urn:ietf:params:oauth:grant-type:token-exchange, subject_issuer=https://accounts.google.com, validation_method='user info', client_auth_method=client-secret

这是我对Keycloak执行的请求,在Postman上手动执行,期望交换令牌:

curl --location --request POST 'http://localhost:8080/auth/realms/my-realm/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'client_id=android-app' \
    --data-urlencode 'client_secret=a1739b19-3131-4f5c-ba31-8d24afff8d84' \
    --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
    --data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:refresh_token' \
    --data-urlencode 'subject_token=eyJhbGciOiJSUzI1NiIsImtpZCI6... (truncated)' \
    --data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:jwt' \
    --data-urlencode 'subject_issuer=google'

邮递员响应(400错误请求):

{
    "error": "invalid_token",
    "error_description": "invalid token"
}

Android代码:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestEmail()
    .requestIdToken(clientId) //same client id used on Keycloak Identity Provider
    .requestScopes(new Scope(Scopes.PROFILE), new Scope(Scopes.PLUS_ME), new Scope(Scopes.EMAIL))
    .build();

GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(getApplicationContext(), gso);

GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getApplicationContext());

Log.w("getServerAuthCode", account.getServerAuthCode()); //null
Log.w("getIdToken", account.getIdToken()); //value passed on Postman subject_token parameter

共有1个答案

澹台衡
2023-03-14

我修改了获取令牌的方式:

new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        try {
            String accessToken = GoogleAuthUtil.getToken(
                getApplicationContext(),
                account.getAccount().name, "oauth2:"
                        + "https://www.googleapis.com/auth/userinfo.profile" +
                        " https://www.googleapis.com/auth/plus.profile.emails.read");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }
}.execute();
 类似资料:
  • 发生重定向时,google将重定向到我们的url https://myurl.com/callback?code=somecode 第三步: 反应回来了: HTTP 400错误请求 有人能帮我解决这个问题吗?谢谢!

  • 我们使用Keycloak 12.02进行测试。 这个想法是我们有很多客户,我们都在自己的领域中拥有。我们希望能够为主领域中的管理员/支持用户模拟任何非主领域中的用户。 流程将是: < li >使用超级用户/密码登录到< code >主领域 < li >获取所有可用领域及其用户的列表 < li >为该特定用户创建一个请求,用新的访问令牌交换当前的访问令牌。 这是我无法上班的最后一步。 登录大师领域

  • 我正在构建一个使用JWT进行身份验证的应用程序。我开始做一些研究,但对于诸如刷新令牌和令牌存储之类的主题缺乏共识,我感到惊讶。 据我所知,JWT和OAuth是两个不同的协议,它们遵循不同的规范。 但我的问题是,对于一个没有通过第三方资源服务器如Google、Facebook等认证的应用程序,有一个刷新令牌真的有用吗?为什么不让JWT令牌像刷新令牌一样持续时间长。 另一方面,我可以看到,如本文所述,

  • 当我尝试用Angular和Angular实现XSRF时,我一直得到这个消息。NET CORE:“验证提供的反伪造令牌失败。已交换cookie令牌和请求令牌。”我在Angular和API中都配置了相同的cookie和头名称。有人有什么想法吗? 过程 Angular对此API方法进行初始调用以检索cookie Angular然后截取下一个POST请求并稍微覆盖默认的XSRF处理,因为我需要它来处理HT

  • 我已经学习了这篇关于配置OAuth2客户机的Spring引导OAuth2教程。不幸的是,一旦“用户”通过Idp(Okta)进行身份验证,就会发生带有“代码”的重定向,这将导致一个重定向循环: Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求。 更新:解决方案是将更改为并重新创建授权服务器。

  • 我的目标是获得两个资源服务器特定的访问令牌,其中只包含各自资源服务器特定的数据。 我有以下设置:一个公共客户端使用2个资源服务器。 在配置客户机、用户、领域角色、客户机作用域并使用scope参数之后,我能够创建2个不同的资源服务器特定的访问令牌: 我的问题是,如何将Keycloak配置为第二个访问令牌不包含角色“offline_access”和“uma_authorization”以及AUD:“o