我有Teiid和Keycloak通过OData将数据库公开给Salesforce。当前,身份验证设置为需要用户参与的OAuth。我想切换到JWT进行系统身份验证。
Salesforce JWT要求发行人,主题和受众。颁发者是Keycloak领域的URL,我设置为“客户名”的受众,我设置为通常连接的Keycloak中的用户名的使用者。
我想知道这是否正确...是否可以通过Web浏览器访问Teiid或可以
curl -L -X POST 'https://______:8444/auth/realms/Salesforce/protocol/openid-connect/token' -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'client_id=Salesforce' --data-urlencode 'grant_type=client_credentials' --data-urlencode 'client_secret=3501af______24eec' --data-urlencode 'scope=openid address microprofile-jwt offline_access roles web-origins odata refresh_token full' --data-urlencode 'username=salesforce' --data-urlencode 'password=______' -k
我得到一个有效的JWT令牌。 Teiid具有用于签名的Keycloak的公钥,并且令牌已正确签名。
如果从Salesforce运行它,我会得到
22:45:22,629 DEBUG [org.keycloak.adapters.BearerTokenRequestAuthenticator] (default task-1) Verifying access_token
22:45:22,629 DEBUG [org.keycloak.adapters.BearerTokenRequestAuthenticator] (default task-1) Failed to verify token
22:45:22,630 DEBUG [org.keycloak.adapters.RequestAuthenticator] (default task-1) Bearer FAILED
22:45:22,630 DEBUG [io.undertow.request.security] (default task-1) Authentication outcome was NOT_AUTHENTICATED with method org.keycloak.adapters.wildfly.WildflyAuthenticationMechanism@6f020bee for /odata4/customer.1/customer/CustomerTable/
Keycloak的调试日志什么也不显示。
如果我在请求容器中捕获了Salesforce令牌,我可以看到
{
"kid": "tvvj4du2zx5aagbqtqhpypghb9c5acz6jtj3rqpfaia",
"typ": "JWT",
"alg": "RS256"
}
{
"iss": "https://______________:8444/auth/realms/Salesforce",
"sub": "salesforce",
"aud": "Salesforce",
"nbf": 1594787722,
"iat": 1594787722,
"exp": 1594787842
}
我可以看到它已使用与Teiid相同的公钥正确签名。
我只能看到的是 (1)Keycloak中的孩子是一些哈希,并且Salesforce将证书别名放在JWT孩子字段中,因此我更改了别名以匹配孩子(当然,它是小写字母)并重新上传了证书。智威汤逊的孩子有关系吗? (2)我的领域是Salesforce(请参阅iss),我的客户是Salesforce(aud),我的用户名是salesforce(sub)。假设用户名在这里毫无意义,应该像客户机密一样?使用curl,keycloak给了我一些看起来像哈希的潜艇。
谢谢。