prathyusha magam
prathyusha magam

Reputation: 189

How to obtain refresh token for sharepoint app-only model?

We've a customer requirement to authenticate to sharepoint online using sharepoint app-only model.Obtained access token by posting a request to Microsoft Azure ACS," https://accounts.accesscontrol.windows.net/cde6fa59-abb3-4971-be01-2443c417abcd/tokens/OAuth/2" with client_credentials in request body using postman tool.

As access token expires, how to get refresh token?

From the above request, we only get access token. Do we've a separate endpoint to retrieve refresh token.

Please help.enter image description here

Upvotes: 5

Views: 859

Answers (1)

Antonio Leonardo
Antonio Leonardo

Reputation: 1862

The approach to consume Refresh Token is using Cookies to help the client reneew credentials. In this documenation Authorization Code OAuth flow for SharePoint Add-ins contains an example with C# Programming to get Refresh Token from Cookie.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.SharePoint.Samples;

namespace DynamicAppPermissionRequest
{
  public static class TokenCache
  {
    private const string REFRESH_TOKEN_COOKIE_NAME = "RefreshToken";

    public static void UpdateCacheWithCode(HttpRequest request,
                                            HttpResponse response,
                                            Uri targetUri)
    {
      string refreshToken =
          TokenHelper.GetAccessToken(
              request.QueryString["code"],
              "00000003-0000-0ff1-ce00-000000000000",
              targetUri.Authority,
              TokenHelper.GetRealmFromTargetUrl(targetUri),
              new Uri(request.Url.GetLeftPart(UriPartial.Path))
          ).RefreshToken;
      SetRefreshTokenCookie(response.Cookies, refreshToken);
      SetRefreshTokenCookie(request.Cookies, refreshToken);
    }

    internal static string GetCachedRefreshToken(HttpCookieCollection requestCookies)
    {
      return GetRefreshTokenFromCookie(requestCookies);
    }

    internal static bool IsTokenInCache(HttpCookieCollection requestCookies)
    {
      return requestCookies[REFRESH_TOKEN_COOKIE_NAME] != null;
    }

    private static string GetRefreshTokenFromCookie(HttpCookieCollection cookies)
    {
      if (cookies[REFRESH_TOKEN_COOKIE_NAME] != null)
      {
        return cookies[REFRESH_TOKEN_COOKIE_NAME].Value;
      }
      else
      {
        return null;
      }
    }

    private static void SetRefreshTokenCookie(HttpCookieCollection cookies, string refreshToken)
    {
      if (cookies[REFRESH_TOKEN_COOKIE_NAME] != null)
      {
        cookies[REFRESH_TOKEN_COOKIE_NAME].Value = refreshToken;
      }
      else
      {
        HttpCookie cookie = new HttpCookie(REFRESH_TOKEN_COOKIE_NAME, refreshToken);
        cookie.Expires = DateTime.Now.AddDays(30);
        cookies.Add(cookie);
      }
    }
  }
}

Upvotes: 0

Related Questions