postgresql - 如何使用用户名和密码从 Azure AD 检索到的 token 对 Azure PostgreSQL 进行身份验证?

标签 postgresql azure azure-active-directory azure-postgresql

我使用了https://learn.microsoft.com/en-us/azure/postgresql/howto-configure-sign-in-aad-authentication处的文档使 Azure AD 中的用户能够使用 token 向 Azure PostgreSQL 实例进行身份验证。我希望 Java 桌面应用程序的用户能够使用他们的用户名和密码进行身份验证并自动获取 token 。为此,我在我的租户中创建了一个公共(public)应用程序。我使用用户名和密码进行身份验证以获取访问 token 没有遇到任何问题,但该 token 显然不适合针对 https://ossrdbms-aad.database.windows.net 进行身份验证.

我收到错误“致命:访问 token 没有有效签名或已过期。请获取新 token 并重试。”

这是我正在使用的代码:

import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.PublicClientApplication;
import com.microsoft.aad.msal4j.UserNamePasswordParameters;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import java.util.Set;

public class AuthTest {

    private final static String APP_ID = "096f6bc7-cf30-4b06-9f0e-093aaf3f9a4c";
    private final static String AUTHORITY = "https://login.microsoftonline.com/organizations";

    private static Connection getConnection(final String serverName, final String userName, final String password)
            throws Exception {
        final String url = String.format("jdbc:postgresql://%s.postgres.database.azure.com/postgres", serverName);
        final Properties props = new Properties();
        props.setProperty("user", userName + "@" + serverName);
        props.setProperty("password", password);
        props.setProperty("sslmode", "require");
        return DriverManager.getConnection(url, props);
    }

    public static void main(final String[] args) throws Exception {
        final String serverName = args[0];
        final String userName = args[1];
        final String password = args[2];
        final PublicClientApplication pca = PublicClientApplication.builder(APP_ID).authority(AUTHORITY).build();
        final Set<String> scopes = Set.of(
                "User.Read"
        );
        final UserNamePasswordParameters parameters =
                UserNamePasswordParameters.builder(scopes, userName, password.toCharArray()).build();
        final IAuthenticationResult result = pca.acquireToken(parameters).get();
        final String token = result.accessToken();

        final Connection connection = getConnection(serverName, userName, token);
        System.out.println("connection=" + connection);
    }

}

我认为问题是我需要指定 https://ossrdbms-aad.database.windows.net/default (或 https://ossrdbms-aad.database.windows.net//.default )作为资源或范围。当我用此替换 User.Read 时,出现错误“AADSTS65001:用户或管理员尚未同意使用 ID 为“096f6bc7-cf30-4b06-9f0e-093aaf3f9a4c”且名为“AuthTest”的应用程序。发送交互式授权请求对于此用户和资源。”,这是可以理解的,因为我没有像 User.Read 那样通过门户授予同意。但我不知道如何授予此同意。

最佳答案

感谢 Jim Xu,我现在可以正常工作了。我必须添加“Azure OSSRDBMS 数据库”权限,如 /image/o4QO4.png 所示。 ,以管理员身份授予同意,然后将我的应用程序中的范围设置为 https://ossrdbms-aad.database.windows.net/user_impersonation .

关于postgresql - 如何使用用户名和密码从 Azure AD 检索到的 token 对 Azure PostgreSQL 进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64927456/

相关文章:

SQL 检索包含其他表中所有行的行

Azure 服务总线主题/订阅配额和扩展

sql - AWS Schema Conversion Tool可以连接到Azure吗

azure - 从笔记本电脑 Spark 读取 Azure Blob 存储中的文件时出错

azure - 如何在ARM模板中获取AzureAD用户principalId

sql - 逻辑搜索字段数据库选择问题

Postgresql 返回 setof 记录

azure - 为什么每个 azure 客户端 ID 都有多个客户端 key ?

azure - 如何在 Azure Vault 中存储 RSA key

ruby-on-rails - 让 Rails 应用程序使用相同的信息更新两个 POSTGRES 数据库