Ответы пользователя по тегу OAuth
  • Зачем нужен редирект при запросе Access token в авторизации Implicit flow?

    На этапе преобразования кода авторизации (authorization_code) в маркер доступа (access token), в случае успеха, сервер должен вернуть информацию о маркере доступа в ответ на POST-запрос.

    Content-Type: application/json
    {
      access_token: "ABC...XYZ",
      refresh_token: "ABC...XYZ",
      expires_in: 123,
      token_type: "Bearer",
      scope: "..."
    }


    Если это не так, значит, либо код авторизации не проходит, либо поставщик работает неправильно :-) Указывать redirect_uri в данном случае может быть необходимо в качестве дополнительной проверки подлинности запроса, адрес должен соответствовать адресу, который использовался при формировании ссылки входа. Вызова redirect_uri быть не должно. Вызов redirect_uri будет только один раз, когда пользователь пройдет проверку подлинности, выдаст разрешения вашему приложению и поставщик сформирует authorization_code.
    Ответ написан
  • Как взять токен из адресной строки (oauth)?

    Вы должны сохранить полученный маркер доступа (access token). В случае с JavaScript это можно сделать в sessionStorage (в рамках текущей сессии) или localStorage (сохранить на длительный срок), либо передать на сервер (более надежный вариант).

    Код сохранения маркера доступа в хранилище браузера может быть примерно таким:
    if (window.location.hash != '') {
      var hash = window.location.hash.substring(1);
      var accessToken = hash.substr(hash.indexOf('access_token=')).split('&')[0].split('=')[1];
      sessionStorage.setItem('access_token', accessToken);
      // для безопасности, из url лучше удалить access_token
      window.location.hash = '';
      // window.location.href = window.location.href.substr(0, window.location.href.indexOf('#'))
    }
    
    // и далее использовать сохраненный маркер доступа
    var currentAccessToken = sessionStorage.getItem('key');
    Ответ написан
  • Возможна ли авторизация OAuth 2.0 без браузера?

    Поставщик может позволить принимать у пользователя логин и пароль и преобразовывать их в маркер доступа (accsss token). Но, как правило в целях безопасности, никто не дает такой возможности.

    Попробуйте: если grant_type будет password, то данные пользователя можно передавать в параметрах username и password при получении маркера доступа. Либо использовать grant_type равный client_credentials, тогда данные пользователя должны передаваться в HTTP заголовке Authorization (при использовании HTTPS это более безопасный способ, чем password).

    Например, если бы Facebook позволял это делать, то запрос маркера доступа мог бы быть таким:
    https://graph.facebook.com/oauth/access_token?client_id=123&client_secret=abc&
    grant_type=password&username=pupkin&password=000


    В моей библиотеке пока нет возможности менять grant_type снаружи, но можно внутри поменять. Например, InstagramClient.cs, в конструкторе указать GrantType:

    base.GrantType = GrantType.ClientCredentials;

    И далее использовать клиент:

    var client = new InstagramClient
    (
      "9fcad1f7740b4b66ba9a0357eb9b7dda", 
      "3f04cbf48f194739a10d4911c93dcece"
    );
    client.ReturnUrl = "http://oauthproxy.nemiro.net/";
    client.Username = "aleksey";
    client.Password = "Frif#dser#23dssd@Dsdfjjfsi";
    var accessToken = client.AccessToken;

    И сервер ответит:
    {"code": 400, "error_type": "OAuthException", "error_message": "Invalid grant_type"}

    Плохой пример :P

    А вот Facebook, на удивление, вернул маркер доступа:
    var client = new FacebookClient("1435890426686808", "c6057dfae399beee9e8dc46a4182e8fd");
    client.Username = "aleksey";
    client.Password = "a6lGmDZsCb1SuHsIQw89ZqK9";
    var accessToken = client.AccessToken;

    Но у меня сомнения, что поставщик просто так позволит это использовать кому попало, в реальных условиях, без ограничений. Наверняка придется жесткую проверку модератором проходить.
    Ответ написан
  • Как вставить в HTML полученную строку из адресной строки?

    Выделить нужную часть адреса после решетки (#) можно примерно так:
    var hash = window.location.hash;
    
    if (hash.length > 1) 
    {
        alert('Маркер доступа: ' + hash.substring(hash.indexOf('=') + 1));
    }

    Пример

    Этот код должен быть на странице, указанной в redirect_uri, т.е. в данном случае, на странице:
    http://localhost

    Как видно, маркер доступа (access token) вырезается из window.location.hash. Его можно передать, например, в переменную:
    var access_token = hash.substring(hash.indexOf('=') + 1);


    Если планируется использовать другой адрес, то необходимо указать его в настройках конкретного приложения.

    К сожалению, Instagram, на данный момент, позволяет указывать только один адрес обратного вызова для одного приложения.

    Адрес обратного вызова (redirect_uri) в запросе на авторизацию должен полностью совпадать с тем, который указан в настройках приложения (исключая параметры запроса).

    ----------------------------------------------------------------

    ?client_id=64c696ae6b32405a8efcd83889c571be&redirect_uri=http://localhost&response_type=token

    Лучше кодировать параметры URL, чтобы не было проблем.

    PS: Если маркер доступа (access token) в тексте вопроса настоящий, то это небезопасно. Лучше удалить и получить новый.
    Ответ написан