Autoryzacja logowania w dwóch aplikacjach

Autoryzacja logowania w dwóch aplikacjach
AL
  • Rejestracja:ponad 3 lata
  • Ostatnio:około rok
  • Postów:14
0

Cześć, mam pewien problem z dodatkową implementacją.

Jestem niedoświadczonym programistą, ale przejąłem aplikację bo zostałem jedynym w firmie i proszę o pomoc.

Potrzebuję na stronie www.example.com stworzyć button (to nie problem), który po kliknięciu będzie mnie przekierowywał na stronę logowania drugiej aplikacji. Niestety nie wiem jak to zacząć. Nawet nie bardzo wiem w jakim pliku powinienem zacząć pisanie. Dodatkowo, główny widok aplikacji składa się z kafelków, które są modułami, po kliknięciu w któryś, wyskakuje popup do logowania, ścieżka URL się nie zmienia. Każdy moduł w pliku routes.js ma swoją ścieżkę np. /app/pracownicy.
Jak się mogę odnieść do danego modułu z pominięciem głównego ciała aplikacji?
Jak powinien wyglądać mój URL na stronie www.example.com i w którym pliku w aplikacji mam go stworzyć? Czy może ma to być nowy plik?
Logowanie do tej pory odbywa się przez np. www.localhost:8080/app/pracownicy/main. Jak pominąć '/app' w URL-u?
Obecnie, jak wpiszę adres ręcznie www.localhost:8080/app/pracownicy, uruchamia się tylko okienko logowania, ale nie można się zalogować, pewnie o błąd sesji chodzi albo o coś jeszcze innego.
OAuth zda tutaj egzamin, czy są inne sposoby? Na dodatek nie mogę znaleźć żadnego przykładu jak to się robi, wiem, że będzie potrzebny m.in token. Login i hasło też muszę przekazać z podpiętej bazy danych.
Ktoś jest w stanie podpowiedzieć, jak to najlepiej zrobić? Przykłady kodu bardzo mile widziane, żebym sobie mógł to zwizualizować i zobaczyć, jak napisać taki kod.

edytowany 1x, ostatnio: Riddle
Szado
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Kraków
  • Postów:64
1

Ciężko nam pomóc bo nic nie wiemy o projekcie, jak jest zbudowany, czy to rozwiązanie customowe, czy wykorzystuje np. jakiś framework.
Generalnie to o czym piszesz wydaje się proste do zrobienia. Namierz sobie na początku plik w którym ten przycisk ma się znaleźć. Możesz to zrobić np. szukając charakterystycznych translacji/tekstów w projekcie. Jeśli to ma być tylko proste przekierowanie do gotowego uwierzytelnienia, to oAuth Ci tu jest niepotrzebny. Do przycisku dodajesz otwarcie nowego okna pod wskazany adres i tyle.

Szado
Dobra, doczytałem w tytule, że chodzi o Vue.
AL
Ja nie mam dostępu do witryny, na której ma się znajdować button. Moim zadaniem jest stworzenie URL-a, który ze strony www.example.com przekieruje do logowania aplikacji, przy której pracuję. Gdzieś w aplikacji muszę coś dostać, ale nie wiem co i gdzie. Plik app.vue jest pusty, w pliku routes.js są ścieżki do modułów, plik index.js zawiera bibliotekę VueRouter, LoginController.js obsługuje logowanie użytkownika. Nie będę potrzebował tokenu, sesji etc? Czy w routes.js mam dodać nową ścieżkę np. /example/main i jako komponent wskazać plik do logowania?
AL
Dla testów dodałem sobie na widoku aplikacji button z linkiem do logowania, pojawia się okno logowania w nowej karcie, ale podczas próby zalogowania się sypie błędem 500
Xarviel
Bez żadnego przykładu z kodem, nikt Ci nie powie w czym jest problem.
AL
  • Rejestracja:ponad 3 lata
  • Ostatnio:około rok
  • Postów:14
0

plik routes.js

Kopiuj
    path: '/',
    component: () => import('pages/Index')
  },
  {
    path: '/app/zamowienia',
    component: () => import('layouts/zamowienia'),
    children: [
      {
        path: 'main',
        component: () => import('pages/zamowienia/mainZ')
      }
    ]
  }

plik Index.vue

Kopiuj
<div class="col q-pa-xs" style="max-width:800px">
          <!-- templatka przycisku -->
          <div class="row gutter-xs">
            <div class="col-xs-6 col-sm-6 col-md-3 q-pa-xs" v-for="btn in moduleButtons" :key="btn.title"
              :hidden="!btn.active">
              <q-btn outline :disabled="!activeLicense" class="full-width" color="grey-9"
                style="height:16vh;min-height:80px" @click="goToModuleHelper(btn.intent, btn.loginType, btn.moduleId)"
                ripple wait-for-ripple>
                <div class="row full-width">
                  <q-badge color="orange-6" class="absolute-top-left q-ma-xs" v-if="!btn.bagde">{{
                    getNumLicense(btn.moduleId)
                  }}</q-badge>
                  <div class="col-12">
                    <q-badge v-if="btn.beta" color="grey-9" text-color="white" label="BETA" dense />
                  </div>
                  <div class="col-12">
                    <q-icon :name="btn.icon" size="4vh" class="q-pa-xs" color="grey-9" />
                  </div>
                  <div class="col-12">
                    <span class>{{ btn.title }}</span>
                  </div>
                </div>
              </q-btn>
            </div>
          </div>
        </div>

        ...

        goToModuleHelper(intent, type, moduleId) {
          if (moduleId === -1) {
            this.$router.push(intent)
          } else {
            this.gotoModule(intent, type, moduleId)
          }
        },
        
        // metoda wchodzi w wybrany moduł, i przekazuje typ (prc/uzt) logowania do panelu
        gotoModule(intent, type, moduleId) {
          if (type === 'prc') {
            console.log(
              'logowanie użytkownika, sprawdzanie konfiguracji stanowiska'
            )
            // ----
            appInitStationConfig(this.$q)
          }
          this.$store.commit('container/setLoginIntent', intent)
          this.$store.commit('container/setLoginType', type)
          this.$store.commit('container/setLoginModuleId', moduleId)
          // Pokazywanie okna logowania lub przekierowanie do strony logowania
          if (this.$q.screen.xs) {
            this.$router.push('/app/login')
          } else {
            this.dialogLogin = true
            console.log(this.login)
            console.log(this.password)
          }
      }

plik LoginController.js

Kopiuj
function appLoginCheck (store, router, loginType) {
  //
  let currentPage = window.location.pathname
  let intentPage = store.state.container.loginIntent
  // console.log('sprawdzam czy mozna wejsc: cp:' + currentPage + ' ip:' + intentPage)
  // sprawdzanie czy intent sie zgadza ze wczytana stroną
  if (Platform.is.electron) {
    store.commit('container/setLoginType', '')
    store.commit('container/setLoginIntent', '')
  } else {
    if (currentPage === intentPage) {
      console.log('prawidłowe wejście do strony')
      store.commit('container/setLoginType', '')
      store.commit('container/setLoginIntent', '')
    } else {
      // wyrzucanie gdy nie ma intentu wchodzenia na te strone
      console.log('nieprawidłowe wejście do strony, przekierowanie do panelu logowania')
      store.commit('container/setLoginType', loginType)
      store.commit('container/setLoginIntent', currentPage)
      router.push('/app/login')
    }
  }
}
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Wrocław
  • Postów:501
0

Co do /app w path to sprawdz w configu baseUrl https://cli.vuejs.org/config/#baseurl albo po prostu jest route pod takim pathem.

Jeśli panel logowania, do którego masz zrobić button jest w tej samej aplikacji vue, to router.push zmieniasz routa, a jak nie to location.replace('http://google.pl'). Masz zrobić button z redirectem, a piszesz coś o OAuth. Jaka ma być jego rola tutaj?

Jak masz te popupy logowania, to może w Vuexie jest zapisywany token albo dane użytkownika. Sprawdziłeś localStorage i cookies? Jak jest generowany token, to tu powinien być zapisany.

Jak wiesz, w którym komponencie ma być button, to sprawdź vue devtoolsami jego nazwę.


Programować muszę, bo się uduszę
edytowany 2x, ostatnio: 1programmer
Zobacz pozostały 1 komentarz
AL
szafran98, mógłbyś podpowiedzieć, lub podesłać jakiś przykładowy kod, jak mógłbym to rozwiązać?
1programmer
@Aloinopsis: Jak chcesz w wyszukiwarce google umieścić swój button, który przekieruje na jakąkolwiek domenę? XD Nie mam przykładu, nie wiem co to za moduły i jak działają. To są osobne fronty na vue? Na jakiej podstawie stwierdzasz, że /app jest głównym ciałem aplikacji i jakie są kryteria, żeby określić co jest głównym ciałem, a co nie? No i masz jwt, sessionid, ale przecież ty chcesz przekierować do strony logowania, a nie logować, więc to nie powinno mieć nic wspólnego. Z tego co piszesz to masz zrobić redirecta.
1programmer
@Aloinopsis: Jak w ogóle mogłeś zostać jako jedyny pracownik w firmie i przejąć projekt? Nikt nie weryfikował, czy dasz radę i tak o Ci rzucili? Weź szefowi powiedz, żeby kogoś zatrudnił.
1programmer
@Aloinopsis: Pomyśl logicznie co chcesz osiągnąć, znajdź punkt zaczepienia, od czego zacząć i w trakcie zrozumiesz jak działa kod wokół twojego.
AL
www.google.pl to był tylko przykład, żeby odzwierciedlić o co mi chodzi. Możemy przyjąć, że mam stronę internetową www.example.com i na niej umieszczony button. Każdy moduł ma swój path poprzedzony /app/ i component, np. kolejny plik do innego widoku
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Wrocław
  • Postów:501
0

@Aloinopsis: Pokaż inne pliki z routami i storage.

www.google.pl to był tylko przykład, żeby odzwierciedlić o co mi chodzi. Możemy przyjąć, że mam stronę internetową www.example.com i na niej umieszczony button. Każdy moduł ma swój path poprzedzony /app/ i component, np. kolejny plik do innego widoku

Dalej nie wiem co to moduł. Weź spróbuj przeanalizować ten kod.


Programować muszę, bo się uduszę
edytowany 1x, ostatnio: 1programmer
AL
Kiedyś był na telefony taki system Windows Phone, kafelki. Apka jest coś na zwór takich kafelków. Jeden kafelek to jeden moduł, np. pracownicy, maszyny, awarie czy jeszcze inne. Teraz po kliknięciu buttona na stronie www.example.com chcę się dostać np. do kafelka pracownicy od razu do okna logowania. W tym celu w pliku route.js dodałem path: '/nowylink', component: () => import('layouts/pracownicy'), ale nie działa i sypie błędem 500
1programmer
@Aloinopsis: Ziomek nie pisz na temat problemu w komentarzach, bo to mija się z celem. Komentarze są do offtopu. Popatrz na ten kod, który wkleiłeś tutaj, jak wygląda xd
SZ
  • Rejestracja:prawie 3 lata
  • Ostatnio:około rok
  • Postów:22
0

Przeczytałem cały wątek dwa razy ale dalej do końca nie kumam co chcesz zrobić.
Czy twój problem polega na przekierowaniu z domeny example.com na domenę twojaapka.com?
Czy może potrzebujesz przekierować użytkownika na inna stronę w tej samej domenie?

edytowany 1x, ostatnio: szman
AL
  • Rejestracja:ponad 3 lata
  • Ostatnio:około rok
  • Postów:14
0
szman napisał(a):

Czy twój problem polega na przekierowaniu z domeny example.com na domenę twojaapka.com?

Tak, o to chodzi.
Apka ładuje się na localhost:8080. Kiedy się loguję do danego modułu, z pliku routes.js pobierana jest ścieżka np. /app/pracownicy. Czy cała ścieżka to localhost:8080/app/pracownicy.
Teraz mam stworzyć link, który ze strony internetowej np. www.example.com przekieruje mnie bezpośrednia do localhost:8080/pracownicy, a więc z pominięciem /app, jednak musi się to odbyć po nowym URL, np: localhost:8080/amsterdam.
W pliku routes.js dodałem coś takiego:

Kopiuj
{
    path: '/amsterdam',
    // redirect: () => { window.location.href = 'app/pracownicy' },
    beforeEach(to, from, next) { window.open = '/app/pracownicy' },
    component: () => import('layouts/pracownicy')
  }

Działa to na tyle, że otwiera się w przeglądarce okno logowania, ale brakuje id sesji, id modułu, id użytkownika, które są zdefiniowane w index.js. W tym pliku wygląda to następująco:

Kopiuj
data() {
    return {
      moduleButtons: [
        {
          title: 'pracownicy',
          moduleId: 123,
          intent: '/app/pracownicy',
          loginType: 'uzt',
          icon: 'fas fa-user',
          active: true,
          beta: true
        }
      ]
    }
  },
  methods: {
  goToModuleHelper(intent, type, moduleId) {
      if (moduleId === -1) {
        this.$router.push(intent)
      } else {
        this.gotoModule(intent, type, moduleId)
      }
    },
    gotoModule(intent, type, moduleId) {
      if (type === 'prc') {
        console.log(
          'logowanie użytkownika, sprawdzanie konfiguracji stanowiska'
        )
        // ----
        appInitStationConfig(this.$q)
      }
      this.$store.commit('container/setLoginIntent', intent)
      this.$store.commit('container/setLoginType', type)
      this.$store.commit('container/setLoginModuleId', moduleId)
      // Pokazywanie okna logowania lub przekierowanie do strony logowania
      if (this.$q.screen.xs) {
        this.$router.push('/app/login')
      } else {
        this.dialogLogin = true
      }
    }
  }

Chodzi o to, aby jeden moduł działał jakby poza całą aplikacją, był sam sobie.

edytowany 2x, ostatnio: Aloinopsis
AL
  • Rejestracja:ponad 3 lata
  • Ostatnio:około rok
  • Postów:14
0

Teraz przyszedł mi przykład, załóżmy, składamy zamówienia w sklepie internetowym. Potwierdzamy zamówienie i klikamy "zapłać". Click, który jest na buttonie, przekierowuje nas na inną witrynę, czyli do płatności, np payPal. Na tej witrynie mamy już dane z zamówienia, czyli kwotę, może nawet numer zamówienia, datę i inne dane. Chodzi o to, żeby to odzwierciedlić. Zamiast kwoty u mnie jest id modułu, zamiast numeru zamówienia jest id użytkownika itd.
Sam routing czyli

Kopiuj
{
    path: '/amsterdam',
    beforeEach(to, from, next) { window.location = '/app/pracownicy' },
    component: () => import('layouts/pracownicy')
  }

działa.
Ale brakuje właśnie tych parametrów. Aplikacja nie wie do którego modułu ma się zalogować, nie ma przekazanego id użytkownika, id modułu.

1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Wrocław
  • Postów:501
0

No to w query możesz przekazać, chociaż jeśli ma tam byc login albo hasło, to średnio, ale jak są jakieś dane jawne, to w query do routa. Jeśli to jest ta sama aplikacja, to przez vuexa albo event bus.

Masz w dokumentacji https://router.vuejs.org/guide/essentials/navigation.html#navigate-to-a-different-location
Weź poczytaj najlepiej dokumentacje vue, vue routera i vuexa, to ogarniesz ocb.


Programować muszę, bo się uduszę
edytowany 1x, ostatnio: 1programmer
AL
To dwie różne aplikacje, login i hasło muszę przekazać, więc query odpada. Poczytam dokumentacje z linka i będę siedział, aż nie zrobię.
1programmer
@Aloinopsis: No dopiero teraz rozumiem co konkretnie chcesz zrobić. W takim razie vue router tego nie ogarnie, więc nie tutaj szukaj. Weź na example.com zapisz te dane w cookies, a na panelu logowania odczytaj. Chociaż pewnie słabe rozwiązanie jeśli hasło nie będzie zaszyfrowane. Na example.com jesteś zalogowany i to te same dane, którymi logujesz w panelu logowania? To token przekaż do tej drugiej aplikacji i nie będziesz musiał się logować, bo masz token.
AL
Nie mam dostępu do www.example.com, szef trzyma na tym rękę, a ja mam tylko dostarczyć działające URL, które wklei do buttona. Na example.com nie będę zalogowany, mam się zalogować dopiero jak zostanie naciśnięty button, czyli już do jednego konkretnego modułu.
AL
Na podobnej zasadzie działa ceneo.pl. Z oferty, która nas interesuje, klikamy "idź do sklepu". Coś się, dzieje, że pomimo dwie różne aplikacje nie są połączone, to następuje przekierowanie do konkretnego, sklepu, z konkretnym produktem.
1programmer
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Wrocław
  • Postów:501
0

Nie mam dostępu do www.example.com, szef trzyma na tym rękę, a ja mam tylko dostarczyć działające URL, które wklei do buttona. Na example.com nie będę zalogowany, mam się zalogować dopiero jak zostanie naciśnięty button, czyli już do jednego konkretnego modułu.

No to jak nie wpisujesz nigdzie hasła na example.com, to jak chcesz przekazać login i hasło do drugiej aplikacji? XDD Dopiero miałeś przekazywać login i hasło między aplikacjami, a teraz tylko przekierować na stronę. Weź ziomek, bo już tak kręcisz, że szkoda gadać. Programista, a nie wie w jakim komponencie button zrobić. Chcesz wyciągnąć kogoś dane logowania z innej strony. Dodać button na stronie, do której nie masz dostępu i przekierować na swój panel logowania, żeby wyłudzać dane.

To jest art. 286 § 1 k.k. i ja to w tej chwili zgłaszam do prokuratury. Dziękuję bardzo.

Życzę powodzenia.


Programować muszę, bo się uduszę
edytowany 2x, ostatnio: 1programmer
AL
Jakby to miało działać w ramach aplikacji, to bym tematu nie zakładał.
1programmer
@Aloinopsis: No to pytaj na stackoverflow. Inni nie zrozumieli o co ci chodzi, ja próbowałem i też nie jestem w stanie pomóc. Trudno.
1programmer
@Aloinopsis: Ostatnia odpowiedź. Nie umieścisz buttona na example.com jeśli nie masz dostępu do jej kodu, który potem zdeployujesz. EOT
SZ
  • Rejestracja:prawie 3 lata
  • Ostatnio:około rok
  • Postów:22
0

Czyli musisz obsłużyć przekierowanie z zew. domeny na twoją. Jakaś osoba trzecia rozumiem, że ma dostęp do tej aplikacji trzeciej i w porozumieniu z wami doda tam jakiś URL który wy jej przekażecie.
Więc użytkownik klika guzik na tej zew. witrynie i przekierowuje go do was. I teraz pytanie: co ma się dalej zadziać?

AL
  • Rejestracja:ponad 3 lata
  • Ostatnio:około rok
  • Postów:14
0

Już jestem bliżej rozwiązania. Zostało przekazać wymagane parametry potrzebne do logowania.
Spróbuję najpierw sprawdzić URL. Jeśli po / będzie zdefiniowany ciąg znaków, to przekażę na sztywno parametry i użytkownik powinien się móc zalogować.
Nie ma trzeciej apki.
Wcześniej wprowadziłem w błąd, to jest jedna domena.
Osoba klikająca guzik ma się zalogować do apki, ale brakuje parametrów, wymaganych do logowania. W consoli Vue są puste pola.

AL
  • Rejestracja:ponad 3 lata
  • Ostatnio:około rok
  • Postów:14
0

Problem rozwiązany. W istniejącej metodzie stworzyłem ifa, który dodatkowo sprawdza adres URL. Jeśli jest true wtedy przekazuje parametry do logowania. Działa, ale trzeba to ulepszyć, wynikły inne problemy.
Wszystkim zainteresowanym tematem dziękuję za pomoc.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)