使用 Active Directory 在 Azure 上为 Spring OAuth2 应用程序重定向 URL:重定向 URI 参数无效
Redirect URL for Spring OAuth2 app on Azure with Active Directory: Invalid Redirect URI Parameter
我正在学习 Azure 文档的以下两个教程:
https://docs.microsoft.com/en-us/azure/java/spring-framework/deploy-spring-boot-java-app-with-maven-plugin
它显示了如何将简单的 Spring 启动应用程序部署到 Azure 和
https://docs.microsoft.com/en-us/azure/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory
使用 Spring 安全 OAuth2 客户端设置和使用活动目录作为 OAuth2 服务器。
基本上我只是将 OAuth2 依赖项添加到 Maven,如第二个文档中所示的 WebSecurityConfig class 以及 azure.activedirectoy 和 spring.security 属性。
当应用程序只是 运行 来自我的本地计算机时,登录和重定向工作正常。但是当应用程序部署到 Azure 时,我收到一条应用程序错误消息:无效的重定向 URI 参数。我想我已经将 redirect-uri 正确设置为
https://{baseHost}{basePort}{basePath}/login/oauth2/code/azure
在应用程序属性中以及在我的 Active Directory 中的应用程序注册中。
据我所知,授权请求使用了正确的参数:
response_type: code
client_id: 4b5fbcfd-c35f-4bab-bc45-374c7e1dead8
scope: openid https://graph.microsoft.com/user.read
state: yMvo62R-6vgjETSGr_mnh4iIMZimVnFYZRyiGFaOPtE=
redirect_uri: https://myappname.azurewebsites.net/login/oauth2/code/azure
nonce: FUXJ5GoJ2NuNVx2ORU70YCqnJkEj8FRYHEJYMutEQzo
那么,无效的重定向 URI 参数可能是什么,我该如何更改它?
我遵循了这两个教程,它在本地环境中运行良好,在 Azure webapp 上,我遇到了重定向 url 不匹配错误。
原因是 redirect_uri 总是以 http 开头。在applications.properties中加上server.forward-headers-strategy=native
后就可以了。 (我使用的是spring boot 2.2)
这里是pom.xml供您参考。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.example.ad</groupId>
<artifactId>ad</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ad</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<azure.version>2.2.0</azure.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-active-directory-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-spring-boot-bom</artifactId>
<version>${azure.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.9.0</version>
<configuration>
<schemaVersion>V2</schemaVersion>
<resourceGroup>ad-1582615028467-rg</resourceGroup>
<appName>ad-1582615028467</appName>
<pricingTier>P1v2</pricingTier>
<region>westeurope</region>
<runtime>
<os>linux</os>
<javaVersion>jre8</javaVersion>
<webContainer>jre8</webContainer>
</runtime>
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dserver.port=80</value>
</property>
</appSettings>
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
</plugins>
</build>
</project>
最终对我有用的是以下 application.yml。
server:
forward-headers-strategy: FRAMEWORK
port: 8080
error:
include-message: "always" ## You want to be able to supply meaningful error resolution hints to end users.
servlet:
context-path: /myappcontextpath
我正在学习 Azure 文档的以下两个教程: https://docs.microsoft.com/en-us/azure/java/spring-framework/deploy-spring-boot-java-app-with-maven-plugin 它显示了如何将简单的 Spring 启动应用程序部署到 Azure 和 https://docs.microsoft.com/en-us/azure/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory 使用 Spring 安全 OAuth2 客户端设置和使用活动目录作为 OAuth2 服务器。 基本上我只是将 OAuth2 依赖项添加到 Maven,如第二个文档中所示的 WebSecurityConfig class 以及 azure.activedirectoy 和 spring.security 属性。
当应用程序只是 运行 来自我的本地计算机时,登录和重定向工作正常。但是当应用程序部署到 Azure 时,我收到一条应用程序错误消息:无效的重定向 URI 参数。我想我已经将 redirect-uri 正确设置为
https://{baseHost}{basePort}{basePath}/login/oauth2/code/azure
在应用程序属性中以及在我的 Active Directory 中的应用程序注册中。
据我所知,授权请求使用了正确的参数:
response_type: code
client_id: 4b5fbcfd-c35f-4bab-bc45-374c7e1dead8
scope: openid https://graph.microsoft.com/user.read
state: yMvo62R-6vgjETSGr_mnh4iIMZimVnFYZRyiGFaOPtE=
redirect_uri: https://myappname.azurewebsites.net/login/oauth2/code/azure
nonce: FUXJ5GoJ2NuNVx2ORU70YCqnJkEj8FRYHEJYMutEQzo
那么,无效的重定向 URI 参数可能是什么,我该如何更改它?
我遵循了这两个教程,它在本地环境中运行良好,在 Azure webapp 上,我遇到了重定向 url 不匹配错误。
原因是 redirect_uri 总是以 http 开头。在applications.properties中加上server.forward-headers-strategy=native
后就可以了。 (我使用的是spring boot 2.2)
这里是pom.xml供您参考。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.example.ad</groupId>
<artifactId>ad</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ad</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<azure.version>2.2.0</azure.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-active-directory-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-spring-boot-bom</artifactId>
<version>${azure.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-webapp-maven-plugin</artifactId>
<version>1.9.0</version>
<configuration>
<schemaVersion>V2</schemaVersion>
<resourceGroup>ad-1582615028467-rg</resourceGroup>
<appName>ad-1582615028467</appName>
<pricingTier>P1v2</pricingTier>
<region>westeurope</region>
<runtime>
<os>linux</os>
<javaVersion>jre8</javaVersion>
<webContainer>jre8</webContainer>
</runtime>
<appSettings>
<property>
<name>JAVA_OPTS</name>
<value>-Dserver.port=80</value>
</property>
</appSettings>
<deployment>
<resources>
<resource>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</deployment>
</configuration>
</plugin>
</plugins>
</build>
</project>
最终对我有用的是以下 application.yml。
server:
forward-headers-strategy: FRAMEWORK
port: 8080
error:
include-message: "always" ## You want to be able to supply meaningful error resolution hints to end users.
servlet:
context-path: /myappcontextpath