Google OAuth 2错误:redirect_uri_mismatch随机网址参数ASP.NET

时间:2014-08-20 19:53:38

标签: asp.net-mvc oauth-2.0 google-api

我已通过下面的模板在我的网站上通过VK,Instagram,Facebook进行身份验证。 但是谷歌需要"重定向网址"。 我的重定向网址如下:

http://localhost:4588/main/AuthenticationCallback?__provider__=google%2B&__sid__=6f3cc5957e4742758719f9b7decc2c09

参数" sid "每次都是随机的。所以我无法提供谷歌精确的URL。我尝试输入http://localhost:4588/main/AuthenticationCallback,就像我为Instagram做的那样,它适用于Instagram,但谷歌一直在向我展示" 400错误:redirect_uri_mismatch"

我还试图将授权网址中的http://localhost:4588/main/AuthenticationCallback作为网址参数传递到谷歌下面。但在这种情况下,方法" IAuthenticationClient.RequestAuthentication"根本没有被召唤。

你能告诉我应该输入什么"重定向网址"我的谷歌应用程序?

使用OAuth2的模板类:

public class GoogleAuthenticationClient : IAuthenticationClient
{
    public string appId;
    public string appSecret;
    private string redirectUri;

    public GoogleAuthenticationClient(string appId, string appSecret)
    {
        this.appId = appId;
        this.appSecret = appSecret;
    }

    string IAuthenticationClient.ProviderName
    {
        get { return "google+"; }
    }

    void IAuthenticationClient.RequestAuthentication(HttpContextBase context, Uri returnUrl)
    {
        var APP_ID = this.appId;
        this.redirectUri = context.Server.UrlEncode(returnUrl.ToString());

        var address = String.Format(
                "https://accounts.google.com/o/oauth2/auth?client_id={0}&redirect_uri={1}&response_type=code&scope={2}",
                APP_ID, this.redirectUri, "https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/userinfo.email"
            );

        HttpContext.Current.Response.Redirect(address, false);
    }

    class AccessToken
    {
        public string access_token = null;
        public string user_id = null;
    }

    class UserData
    {
        public string uid = null;
        public string first_name = null;
        public string last_name = null;
        public string photo_50 = null;
    }

    class UsersData
    {
        public UserData[] response = null;
    }

    AuthenticationResult IAuthenticationClient.VerifyAuthentication(HttpContextBase context)
    {
        try
        {
            string code = context.Request["code"];

            var address = String.Format(
                    "https://accounts.google.com/o/oauth2/token?client_id={0}&client_secret={1}&code={2}&redirect_uri={3}",
                    this.appId, this.appSecret, code, this.redirectUri);

            var response = GoogleAuthenticationClient.Load(address);
            var accessToken = GoogleAuthenticationClient.DeserializeJson<AccessToken>(response);

            address = String.Format(
                    "https://www.googleapis.com/plus/v1/people/{0}?access_token=1/fFBGRNJru1FQd44AzqT3Zg",
                    accessToken.user_id);

            response = GoogleAuthenticationClient.Load(address);
            var usersData = GoogleAuthenticationClient.DeserializeJson<UsersData>(response);
            var userData = usersData.response.First();

            return new AuthenticationResult(
                true, (this as IAuthenticationClient).ProviderName, accessToken.user_id,
                userData.first_name + " " + userData.last_name,
                new Dictionary<string, string>());
        }
        catch (Exception ex)
        {
            return new AuthenticationResult(ex);
        }
    }

    public static string Load(string address)
    {
        var request = WebRequest.Create(address) as HttpWebRequest;
        using (var response = request.GetResponse() as HttpWebResponse)
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                return reader.ReadToEnd();
            }
        }
    }

    public static T DeserializeJson<T>(string input)
    {
        var serializer = new JavaScriptSerializer();
        return serializer.Deserialize<T>(input);
    }
}

我的控制器中的代码:

    public void ExternalLogin(string provider)
    {
        OAuthWebSecurity.RegisterClient(
            client: new GoogleAuthenticationClient(
                    "APP_ID", "APP_CODE"),
            displayName: "google+", // надпись на кнопке
            extraData: null);

        ExternalLoginCallback(provider);
    }

    public void ExternalLoginCallback(string provider)
    {
        OAuthWebSecurity.RequestAuthentication(provider, Url.Action("AuthenticationCallback"));
    }

    public ActionResult AuthenticationCallback()
    {
        var result = OAuthWebSecurity.VerifyAuthentication();

        if (result.IsSuccessful == false)
        {
            return null;
        }
        else
        {
            var provider = result.Provider;
            var uniqueUserID = result.ProviderUserId;
            return RedirectToAction("Main", "Main");
        }            
    }

1 个答案:

答案 0 :(得分:4)

您可以按照以下说明授权重定向URI,但是您无法向重定向uri添加任何参数,请参阅此答案,了解如何将参数传递给Google google oauth2 redirect_uri with several parameters

在Google云端控制台上创建客户端(&#34; APP_ID&#34;,&#34; APP_CODE&#34;)时,需要设置授权重定向URI。只需导航到项目的API控制台,然后编辑Web客户端以设置您想要使用的正确重定向URI。

enter image description here