之前在他们认为偏离主题的Salesforce StackExchange中问了这个问题,所以在这里询问我是否能得到答案。
我正在尝试使用immediate参数来检查Salesforce用户在通过OAuth 2.0 Web Server Authentication Flow中记录的Web服务器OAuth流时是否已经批准访问权限。我的理由是,我不希望出现登录或同意提示,因此如果他们尚未批准,我可以拒绝访问。
点击回调页面后,即使用户之前已经批准了该应用程序并且已登录,我仍然会收到参数error=immediate_unsuccessful
。
我试图通过自定义的Google OAuth 2 Playground检查这一点,并在authorize端点的末尾设置immediate = true或immediate = false。在= false时,会显示同意提示,然后您可以授予访问权限。 On = true,返回与先前列出的相同的错误。
已设置的已连接应用程序具有api和refresh_token作为可用范围,用户可以自行授权并且没有设置ip限制。然后,此应用程序中的客户端ID和密码将传递到OAuth 2 Playground。
下面是一个简短的示例,说明我的正确应用程序如何使用Java和Google OAuth客户端库重定向到auth url。我们最初在没有立即声明的情况下授权客户端,然后稍后使用immediate = true调用相同的代码(如示例所示)
AuthorizationCodeFlow authorizationCodeFlow = new AuthorizationCodeFlow.Builder(BearerToken.authorizationHeaderAccessMethod(),
httpTransport,
GsonFactory.getDefaultInstance(),
new GenericUrl("https://login.salesforce.com/services/oauth2/token"),
new ClientParametersAuthentication(CLIENT_ID, CLIENT_SECRET),
CLIENT_ID,
"https://login.salesforce.com/services/oauth2/authorize")
.setCredentialDataStore(StoredCredential.getDefaultDataStore(MemoryDataStoreFactory.getDefaultInstance()))
.build();
AuthorizationCodeRequestUrl authUrl = authorizationCodeFlow.newAuthorizationUrl()
.setRedirectUri("https://72hrn138.ngrok.io/oauth/callback")
.setScopes(ImmutableSet.<String> of("api", "refresh_token"))
.set("prompt", "consent")
.set("immediate", "true");
response.redirect(authUrl);
答案 0 :(得分:1)
我最终设法解决了这个问题。要允许immediate=true
选项起作用,必须从请求中删除范围。在提供的示例中,您将authUrl
修改为以下内容:
AuthorizationCodeRequestUrl authUrl = authorizationCodeFlow.newAuthorizationUrl()
.setRedirectUri("https://72hrn138.ngrok.io/oauth/callback")
.set("prompt", "consent")
.set("immediate", "true");
我认为理论是定义范围意味着您要求使用这些范围的权限,因此需要批准这些权限。这与立即选项冲突,该选项指出用户必须已登录并且客户端ID已被批准才能成功。