如何在独立程序中自动从用户检索OAuth代码

时间:2013-06-04 13:54:13

标签: gmail google-drive-api

任何人都可以帮助我们通过java代码运行URL:

我们正尝试将文件从本地驱动器上传到Gmail云端硬盘。

遵循的步骤

  1. 借助Google Developer(API)生成网址

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
         httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
         .setAccessType("online")
         .setApprovalPrompt("auto").build();
    
    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
    
  2. 获得以下网址

      

    https://accounts.google.com/o/oauth2/auth?access_type=online&approval_prompt=auto&client_id=1066028402320.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/drive

  3. 在互联网浏览器中运行网址

  4. 用户ID和密码在互联网浏览器中作为输入提供,以获取唯一的响应令牌

  5. 现在,作为我们开发的一部分,我们已经完成了第2步,并希望自动执行步骤3& 4使用java代码。 (后 生成随UserdId和密码提供的URL,我们应该将响应作为唯一令牌。)

    期待你的帮助

1 个答案:

答案 0 :(得分:2)

我会使用以下方案

  1. 设置本地网络服务器以从用户的oauth重定向检索代码
  2. 将流的redirect_uri设置为本地网络服务器并获取auth url
  3. 为用户打开auth url浏览器
  4. 从本地网络服务器检索代码并交换oauth代码
  5. 以下是代码的更多细节。

    设置本地网络服务器以检索HTTP请求

    以下是使用NanoHttpd

    设置本地网络服务器的示例
    public class OAuthServer extends NanoHTTPD {
        /**
         * Constructs an HTTP server on given port.
         */
        public DebugServer() {
            super(8080);
        }
    
        @Override
        public Response serve(String uri, Method method, Map<String, String> header, Map<String, String> parms, Map<String, String> files) {
            bool error = false
            string code = null
            // User rejected approval
            if (parm.containsKey("error")) {
                error = true
            }
            // Here we get the code!
            if (parm.containsKey("code")) {
                code = parm.get("code")
            }
            StringBuilder sb = new StringBuilder();
            sb.append("<html>");
            sb.append("<head><title>Authorization</title></head>");
            sb.append("<body>");
            if (error) {
                sb.append("<h1>User rejected</h1>");
            }
            if (code==null) {
                sb.append("<h1>Unknown Error</h1>");
            }
            else {
                sb.append("<h1>Success</h1>");
            }
            sb.append("</body>");
            sb.append("</html>");
            return new Response(sb.toString());
        }
    
        public static void main(String[] args) {
            ServerRunner.run(OAuthServer.class);
        }
    }
    

    将流量的redirect_uri设置为本地网络服务器并获取身份验证网址

    String url = flow.newAuthorizationUrl().setRedirectUri("http://localhost:8080").build();
    

    为用户打开auth url浏览器

    // open the default web browser for the HTML page
    Desktop.getDesktop().browse(url);
    

    从本地网络服务器检索代码并交换oauth代码

    现在,用户将从Web浏览器批准OAuth并将代码发送到我们刚刚启动的本地Web服务器。现在我们已经从本地Web服务器检索了代码,我们可以将其解析为int并进行身份验证并使用它进行授权!

    希望这有帮助