Ionic3 / Android - 通过Oauth2连接到仅支持授权类型的网站"授权代码"?

时间:2018-03-02 17:15:11

标签: oauth-2.0 ionic3

I KNOW OAuth 2定义了四种授权类型,每种类型在不同情况下都很有用。

我想将我的Ionic应用程序连接到仅支持"授权代码"授权类型。

这可能吗?如果是这样,我对包/库使用什么?

2 个答案:

答案 0 :(得分:3)

问题不在于你能做到吗,但你应该这样做。作为授权代码授权类型的一部分,您需要使用客户端ID和密钥来交换访问令牌的授权代码。这个秘密就是这里的垮台。您无法在客户端应用程序(也称为Ionic 3)中安全地保存该秘密。这就是为什么Ionic通常会使用Implicit流(如果部署为SPA),或使用Proof Key for Code Exchange的授权代码授权 - PKCE(如果部署为本机应用程序)。

现在说,您可以站起来,您的Ionic客户端可以调用服务器端API,服务器端API可以代表客户端进行一些OAuth握手。这可能是一种创造性的解决方法。不确定解决方案的“纯粹”程度。 Auth0的网站上有一些有用的文档:

答案 1 :(得分:0)

与此同时,我发现了一种处理来自 Ionic2 的Oauth2流的非常好的方法。见this nice article

类似的技巧也适用于 Android ,请参阅下面的下一个示例。

对于 Ionic ,内心正在使用redirect-url" http://localhost/callback"。

public facebookLogin(): Promise<any> {
    return new Promise(function(resolve, reject) {
        var browserRef = window.cordova.InAppBrowser.open("https://www.facebook.com/v2.0/dialog/oauth?client_id=" + "CLIENT_ID_HERE" + "&redirect_uri=http://localhost/callback&response_type=token&scope=email", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
        browserRef.addEventListener("loadstart", (event) => {
            if ((event.url).indexOf("http://localhost/callback") === 0) {
                browserRef.removeEventListener("exit", (event) => {});
                browserRef.close();
                var responseParameters = ((event.url).split("#")[1]).split("&");
                var parsedResponse = {};
                for (var i = 0; i < responseParameters.length; i++) {
                    parsedResponse[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
                }
                if (parsedResponse["access_token"] !== undefined && parsedResponse["access_token"] !== null) {
                    resolve(parsedResponse);
                } else {
                    reject("Problem authenticating with Facebook");
                }
            }
        });
        browserRef.addEventListener("exit", function(event) {
            reject("The Facebook sign in flow was canceled");
        });
    });
}

对于 Android ,我创建了一个类似的解决方案,它使用真正的Oauth2&#34; authorization_code&#34;流。这是唯一支持移动设备的解决方案。使用此授权代码的应用程序&#39;流程非常好。

关键部分是:

myWebView.setWebViewClient( new WebViewClient() { 
    @Override
    public boolean shouldOverrideUrlLoading( WebView view, String url) {
        if( url.startsWith( "http://localhost/callback")) {
           String code = url.replaceFirst("^.*\\?code=([^&]+)&state.*$", "$1");
           // get the other tokens via a REST JSON call