Access Youtube Channel ID once signed in though Firebase GoogleAuthProvider

浪子不回头ぞ 提交于 2019-12-11 04:24:56

问题


I've setup a basic Firebase authentication app which uses Google. I've passed the following scopes:

https://www.googleapis.com/auth/youtube.force-ssl

When logging in, it states that it is gaining permission to manage my Youtube Account, but the response I get back has nothing relevant to Youtube in it, such as a channelId.

Even when doing a simple $http.get request against the logged in accounts Youtube subscriptions I get the following response:

The request uses the <code>mine</code> parameter but is not properly authorized.

So would I need to login through Google, then authenticate again once signed in to access my Youtube account?

Sample login:

var provider = new firebase.auth.GoogleAuthProvider();
provider.addScope("https://www.googleapis.com/auth/youtube.force-ssl");

$scope.login = function () {

    Auth.$signInWithPopup(provider).then(function (result) {
        console.log(result);
        console.log("Signed in as:", result.user.uid);
    }).catch(function (error) {
        console.error("Authentication failed:", error);
    });

}

回答1:


Apologies in the delay.

Here is how I solved this problem. When logging in using Firebase with Google as a provider, I get the access_token given by Google and query YouTubes API to get the correct channel.

An example of my login function is below:

        this.loginMainGoogle = function (event) {
            gapi.auth2.getAuthInstance().signIn().then(function _firebaseSignIn(googleUser) {
                var unsubscribe = $rootScope.authObj.$onAuthStateChanged(function (firebaseUser) {
                    unsubscribe();

                    // Check if we are already signed-in Firebase with the correct user.
                    if (!_isUserEqual(googleUser, firebaseUser)) {
                        // Build Firebase credential with the Google ID token.
                        console.log(googleUser.getAuthResponse());
                        var credential = firebase.auth.GoogleAuthProvider.credential(
                            googleUser.getAuthResponse().id_token);

                        // Sign in with credential from the Google user.
                        return $rootScope.authObj.$signInWithCredential(credential)
                            .then(function (result) {

                                var ytToken = googleUser.getAuthResponse().access_token;
                                localStorage.setItem('gToken', ytToken);
                                $rootScope.tokenerino = ytToken;

                                $http.get("https://www.googleapis.com/youtube/v3/channels?part=id&mine=true&access_token=" + ytToken)
                                .then(function(response) {
                                    $rootScope.myChan = response.data.items[0].id;
                                    localStorage.setItem('myChannelId', $rootScope.myChan);
                                    updateYTChannel(result.uid, response.data.items[0].id);
                                });

                                $rootScope.currentLoginStatus = true;
                                $rootScope.notification("You Have Signed In");

                                //Don't redirect them if they login via a YouTube playlist
                                if ($location.path().indexOf('playlists') !== 1) {
                                    $state.go('mymusic');
                                }

                            }, function errorCallback(error) {
                                console.log(error);
                            });
                    }

                })

            });

        }

I store the Channel for the user in Firebase, but you can put it in localStorage if you want. The only problem is that the access_token only lasts for 1 hour. Hopefully this helps anyone and if a better solution has been found - feel free to share!



来源:https://stackoverflow.com/questions/44229111/access-youtube-channel-id-once-signed-in-though-firebase-googleauthprovider

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!