2016-08-11 54 views
0

以前在Salesforce StackExchange中问过这个问题,他们认为这是题外话,所以在这里问我是否可以得到答案。在Salesforce OAuth流程中使用immediate = true


背景

我试图用眼前的参数来检查,如果通过Web服务器的OAuth流作为在案OAuth 2.0 Web Server Authentication Flow去当Salesforce用户已经批准访问。我的推理是,我不希望登录或同意提示出现,因此如果他们尚未获得批准,我可以拒绝访问。

一旦回调页面被击中,我总是接收参数error=immediate_unsuccessful即使用户已经批准之前,申请并已登录。

我试图通过检查这个定制Google OAuth 2 Playground并设置立即= true或immediate = false到授权端点的末尾。 On = false时,显示同意提示,然后您可以授予访问权限。 On = true,这将返回与前面列出的相同的错误。

已设置的已连接应用程序具有api和refresh_token作为可用范围,用户可以自行授权并且没有设置ip限制。然后将此应用的客户端ID和密码传递到OAuth 2 Playground。

下面是关于我的正确应用程序如何使用Java和Google OAuth客户端库重定向到身份验证URL的简要示例。我们最初授权客户没有立即再后来就调用相同的代码,即日=真(例如所示)

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); 

问题(S)

  • 是否存在,我可能有任何设置在Salesforce错过了会减轻错误?
  • OAuth 2规范中是否有任何其他选项必须设置为即时选项才能工作?
  • 立即设置工作?

回答

0

我在最后设法解决了这个问题。要允许immediate=true选项起作用,必须从请求中删除范围。在提供的例子,你会修改authUrl以下几点:

AuthorizationCodeRequestUrl authUrl = authorizationCodeFlow.newAuthorizationUrl() 
    .setRedirectUri("https://72hrn138.ngrok.io/oauth/callback") 
    .set("prompt", "consent") 
    .set("immediate", "true"); 

相信的理论是,定义范围是指你所要求的权限来使用这些范围,因此需要批准这些权限。这与即时选项冲突,该选项声明用户必须登录并且客户端ID已经被批准才能成功。