簡體   English   中英

如何從wix api網站在ruby on rails應用程序的api調用帖子中獲取身份驗證代碼?

[英]How to get Auth code in api call post on ruby on rails app from wix api website?

我正在嘗試為wix應用程序開發儀表板網站,我需要將該網站連接到wix應用程序。

我的 api(post)調用有問題。 我必須填寫一些信息,包括我不知道在哪里可以找到的身份驗證代碼。

這是一張圖片來說明這個過程:

在此處輸入圖片說明

我真的不知道什么是wix應用標記安裝,但對於授權請求,我這樣做了

    $url_oauth = "https://www.wix.com/oauth/access"
    response = RestClient::Request.execute(url: $url_oauth, method: :post, body:{grant_type: "authorization_code",client_id:"APP_ID", client_secret:"Secret_key", code:"{Can not find what is this value}"})
    @data = JSON.parse(response)
    render json: response

這是文檔:

在此處輸入圖片說明

你能幫助如何以及在哪里找到這個授權碼嗎?

您需要創建一個中間 Web 服務,該服務將接受來自 WIX 的 Webhook。 我將向您展示 C# ASP.Net Core 的示例。
步驟1:
我們正在等待來自 WIX 的令牌,如果收到,我們會進行重定向。

private const string AppID = "";
private const string ApiKey = "";
private const string UrlAccess = "https://www.wix.com/oauth/access";
            
HttpGet("WaitToken")]
public ActionResult GetToken([FromQuery] string token = "")
{
    try
    {
        if (string.IsNullOrWhiteSpace(token))
        {
            string message = "Your message";
            ModelState.AddModelError("TokenNotCorrect", message);
            return BadRequest(ModelState);
        }

        string paramUrl = @"https://your web service/OAuth/api/check/WaitAuthCode";
        string urlRedirect = $@"https://www.wix.com/installer/install?token={token}&appId={AppID}&redirectUrl={paramUrl}";
        return RedirectPermanent(urlRedirect);
    }
    catch (WebException ex)
    {
        ModelState.AddModelError("GetTokenException", ex.Message);
        return BadRequest(ModelState);
    }
}

第2步:
我們正在等待收到驗證碼,前提是用戶已確認安裝了應用程序。

[HttpGet("WaitAuthCode")]
public async Task<ActionResult> GetAuthCodeAsync([FromQuery] string code = "", string state = "", string instanceId = "")
{
    try
    {
        if (string.IsNullOrWhiteSpace(code))
        {
            string message = "your message";
            ModelState.AddModelError("AuthCodeNotCorrect", message);
            return BadRequest(ModelState);
        }

        var token = new Token(code);
        if (!GetAccessToken(ref token))
            return BadRequest("your message RefreshToken");

        var tokenBase = new TokenBase
        {
            AppID = instanceId,
            Token = token.RefreshToken
        };

        db.Tokens.Add(tokenBase);
        if(await db.SaveChangesAsync() == 0)
            return BadRequest("your message");

        string urlRedirect = $"https://www.wix.com/installer/token-received?access_token={token.AccessToken}";
        return RedirectPermanent(urlRedirect);
    }
    catch (WebException ex)
    {
        ModelState.AddModelError("GetAuthCodeException", ex.Message);
        return BadRequest(ModelState);
    }
}

AuthCode 的有效期為 10 分鍾,我們發送請求以接收刷新令牌。 這個令牌必須放在家里,因為將來需要它來獲取訪問令牌。

private bool GetAccessToken(ref Token token)
{
    try
    {
        string json = JsonConvert.SerializeObject(token, Formatting.Indented);

        var client = new RestClient(UrlAccess);
        var request = new RestRequest();
        request.Method = Method.POST;
        request.AddHeader("Content-Type", "application/json");
        request.AddParameter(string.Empty, json, "application/json", ParameterType.RequestBody);

        var response = client.Post(request);
        if (response == null)
            return false;
            
        token = JsonConvert.DeserializeObject<Token>(response.Content);

        if (string.IsNullOrWhiteSpace(token.RefreshToken))
            return false;
            
        return !string.IsNullOrWhiteSpace(token.AccessToken);
    }
    catch (Exception ex)
    {
        return false;
    }
}

從客戶端應用程序獲取訪問令牌:

[HttpGet("WaitAccessToken")]
public async Task<ActionResult<string>> GetAccessToken([FromQuery] string instance = "", string apiKey = "")
{
    string message;

    var tokenBase = await db.Tokens.FirstOrDefaultAsync(x => x.AppID == instance);
    if (tokenBase == null)
    {
        message = "Your message";
        ModelState.AddModelError("AppIdNotFound", message);
        return NotFound(ModelState);
    }

    var token = new Token
    {
        GrantType = "refresh_token",
        RefreshToken = tokenBase.Token
    };

    if (!GetAccessToken(ref token))
    {
        message = $"Your message";
        ModelState.AddModelError("NotCorrectAccessToken", message);
        return BadRequest(ModelState);
    }

    return new ObjectResult(token.AccessToken);
}

模型代幣:

public class Token
{
    public Token() { }

    public Token(string code) { Code = code; }

    [JsonProperty("grant_type")]
    public string GrantType { get; set; } = "authorization_code";

    [JsonProperty("client_id")]
    public string ClientID { get; set; } = "";
    
    [JsonProperty("client_secret")]
    public string ClientSecret { get; set; } = "";
    
    [JsonProperty("code")]
    public string Code { get; set; }

    [JsonProperty("refresh_token", NullValueHandling = NullValueHandling.Ignore)]
    public string RefreshToken { get; set; }

    [JsonProperty("access_token", NullValueHandling = NullValueHandling.Ignore)]
    public string AccessToken { get; set; }
}

模型實例:

public class Instance
{

    [JsonProperty("instanceId")]
    public string InstanceId { get; set; }

    [JsonProperty("appDefId")]
    public string AppDefId { get; set; }

    [JsonProperty("signDate")]
    public DateTime SignDate { get; set; }

    [JsonProperty("uid")]
    public string Uid { get; set; }

    [JsonProperty("permissions")]
    public string Permissions { get; set; }

    [JsonProperty("demoMode")]
    public bool DemoMode { get; set; }

    [JsonProperty("siteOwnerId")]
    public string SiteOwnerId { get; set; }

    [JsonProperty("siteMemberId")]
    public string SiteMemberId { get; set; }

    [JsonProperty("expirationDate")]
    public DateTime ExpirationDate { get; set; }

    [JsonProperty("loginAccountId")]
    public string LoginAccountId { get; set; }
}

不要忘記要獲得訪問令牌,您將需要安裝它的站點上的應用程序 ID。

[HttpGet("WixInfo")]
public ActionResult GetWixInfo([FromQuery] string instance = "")
{
    try
    {
        string message;
        var base64 = instance.Split(".");
        if (base64.Length != 2)
        {
            message = "Your message";
            ModelState.AddModelError("InstanceNotCorrect", message);
            return BadRequest(ModelState);
        }

        var base64EncodedBytes = Convert.FromBase64String(base64[1]);
        string json = Encoding.Default.GetString(base64EncodedBytes);
        var info = JsonConvert.DeserializeObject<Instance>(json);

        message = $"Your message.AppID: {info.InstanceId}";
        return Ok(message);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("GetWixInfoException", ex.Message);
        return BadRequest(ModelState);
    }
}

當用戶啟動 WIX 應用程序時,您可以獲得正在運行的應用程序的 ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM