Saya memiliki 3 kaki untuk bekerja, dan saya memiliki manajemen login/logout sesi saya sendiri.

Setelah logout, jika pengguna ingin login lagi, dan saya mengirimnya ke https://developer.api.autodesk.com/authentication/v1/authorize, itu akan langsung ke panggilan balik saya dengan pengguna sebelumnya sudah diautentikasi alih-alih meminta login baru.

Sepertinya Autodesk menyimpan sesi sebagai cookie sehingga satu-satunya cara untuk mengalihkan pengguna setelah memberi otorisasi adalah dengan menghapus cache/data browser

Apakah ada cara untuk memaksa logout, atau sesuatu yang mirip dengan "Masuk sebagai pengguna lain"?

Ini adalah pertama kalinya saya melakukan oauth, jadi saya tidak yakin saya melewatkan sesuatu, tetapi sepertinya harus ada cara untuk memaksa menghapus sesi dan memaksa login baru.


Sunting

Biarkan saya lebih memperjelas apa yang saya coba capai:

Inilah yang saya miliki. 1. Saya mengarahkan pengguna ke halaman otentikasi yang mengarahkannya ke: https://developer.api.autodesk.com/authentication/v1/authorize?response_type=code&client_id=obQDn8P0GanGFQha4ngKKVWcxwyvFAGE&redirect_uri=http%3A%2F%2F{{mycallback}}%2Fcallback%3Ffoo%3Dbar&scope=data:read

  1. Pengguna masuk dengan kredensial Autodesk-nya

  2. Alur otorisasi mengalihkan pengguna ke `mycallback.com/callback/?code={{code}}

  3. Backend saya mendapatkan parameter code dari permintaan url, dan membuat permintaan POST ke https://developer.api.autodesk.com/authentication/v1/gettoken

  4. Permintaan tersebut mengembalikan, antara lain, sebuah access_token

  5. Saya menyimpan access_token ke sesi pengguna, dan menggunakannya untuk membuat permintaan berikutnya ke API.

Sampai saat ini, itu berfungsi seperti yang saya harapkan. Sekarang saya ingin mengeluarkan pengguna, dan berpotensi masuk sebagai pengguna yang berbeda.

  1. Titik akhir /logout di server saya menghapus sesi pengguna, menghilangkan access_token.

  2. Setelah bagian belakang menyadari bahwa tidak ada sesi/akses_token yang aktif, itu mengarahkan pengguna ke aliran otentikasi (langkah #1 di atas).

  3. Pada titik ini, saya berharap untuk melihat halaman login Autodesk lain, tetapi sebaliknya, server Autodesk secara otomatis mengotorisasi tanpa login baru, dan mengarahkan pengguna untuk menelepon kembali, dan pengguna masuk lagi.

Jadi untuk mengulangi pertanyaan saya, bagaimana cara mengubah perilaku pada # 9 di atas, sehingga pengguna harus memasukkan kembali kredensialnya?

Saya sering mengalami ini selama pengembangan, di mana saya masuk dengan akun pribadi saya, lalu saya keluar, dan saya ingin masuk dengan akun kerja saya. Saat ini, satu-satunya cara saya bisa melakukannya, adalah dengan Membersihkan cache browser saya. Itu membuat saya berpikir Autodesk menyimpan sesi di browser, dan itulah mengapa dia mengautentikasi ulang tanpa mendapatkan kredensial baru.

Perilaku yang sama terjadi pada dm.autodesk.io Anda Setelah login pertama, jika saya mencoba mengotorisasi lagi, saya tidak diminta untuk login untuk kedua kalinya, melainkan login ulang secara otomatis pada pengguna pertama yang saya login.

Jika saya memahami apa yang terjadi dengan benar, tampaknya API harus memiliki titik akhir yang dapat kita panggil ketika pengguna saya keluar untuk memaksa otentikasi ulang.

Masuk akal?

Terima kasih!

1
gtalarico 15 Maret 2017, 22:04

2 jawaban

Jawaban Terbaik

Cukup muat URL ini: "https://accounts.autodesk.com/Authentication/LogOut" Ini akan keluar dari sesi pengguna sebelumnya dan pengguna baru dapat masuk.

Lihat ini untuk detail lebih lanjut: https://forge.autodesk.com/blog/log- keluar-menempa

1
Ajit A. Kenjale 8 April 2020, 05:34

Saya tidak yakin apa yang Anda maksud dengan "Saya mengirimnya ke https:/ /developer.api.autodesk.com/authentication/v1/authorize" tetapi ini harus terjadi di server Anda.

Periksa sampel saya di https://dm.autodesk.io: Izinkan munculan dan klik "Data Pengguna" di bilah navigasi. Setelah Anda masuk, sesi pengguna disimpan dengan aman di server. Jika Anda memuat ulang halaman itu, Anda akan masuk secara otomatis. Jika Anda mengklik tombol navbar lagi itu akan menghapus sesi di server dan jika Anda memuat ulang Anda tidak akan masuk. Saya kira itulah perilaku yang Anda cari.

Kode untuk proyek ini terletak di sana. Logika berkaki 3 ditangani dari di sana dan lihat seperti di bawah ini (node.js):

import ServiceManager from '../services/SvcManager'
import { serverConfig as config } from 'c0nfig'
import { OAuth2 } from 'oauth'
import express from 'express'

module.exports = function() {

  var router = express.Router()

  ///////////////////////////////////////////////////////////////////////////
  // 2-legged client token: exposes a 'data:read' only token to client App
  //
  ///////////////////////////////////////////////////////////////////////////
  router.get('/token/2legged', async(req, res) => {

    try {

      var forgeSvc = ServiceManager.getService('ForgeSvc')

      var token = await forgeSvc.request2LeggedToken('data:read')

      res.json(token)

    } catch (error) {

      res.status(error.statusCode || 404)
      res.json(error)
    }
  })

  /////////////////////////////////////////////////////////////////////////////
  // Initialize OAuth library
  //
  /////////////////////////////////////////////////////////////////////////////

  var oauth2 = new OAuth2(
    config.forge.oauth.clientId,
    config.forge.oauth.clientSecret,
    config.forge.oauth.baseUri,
    config.forge.oauth.authorizationUri,
    config.forge.oauth.accessTokenUri,
    null)

  /////////////////////////////////////////////////////////////////////////////
  // login endpoint
  //
  /////////////////////////////////////////////////////////////////////////////
  router.post('/login', function (req, res) {

    var authURL = oauth2.getAuthorizeUrl({
      redirect_uri: config.forge.oauth.redirectUri,
      scope: config.forge.oauth.scope.join(' ')
    })

    res.json(authURL + '&response_type=code')
  })

  /////////////////////////////////////////////////////////////////////////////
  // logout endpoint
  //
  /////////////////////////////////////////////////////////////////////////////
  router.post('/logout', (req, res) => {

    var forgeSvc = ServiceManager.getService(
      'ForgeSvc')

    forgeSvc.delete3LeggedToken(req.session)

    res.json('success')
  })

  /////////////////////////////////////////////////////////////////////////////
  // Reply looks as follow:
  //
  //  access_token: "fk7dd21P4FAhJWl6MptumGkXIuei",
  //  refresh_token: "TSJpg3xSXxUEAtevo3lIPEmjQUxXbcqNT9AZHRKYM3",
  //  results: {
  //    token_type: "Bearer",
  //    expires_in: 86399,
  //    access_token: "fk7dd21P4FAhJWl6MptumGkXIuei"
  //  }
  //
  /////////////////////////////////////////////////////////////////////////////
  router.get('/callback/oauth', (req, res) => {

    var socketSvc = ServiceManager.getService(
      'SocketSvc')

    // filter out errors (access_denied, ...)
    if (req.query && req.query.error) {

      if (req.session.socketId) {

        socketSvc.broadcast(
          'callback', req.query.error,
          req.session.socketId)
      }

      res.json(req.query.error)
      return
    }

    if(!req.query || !req.query.code) {

      res.status(401)
      res.json('invalid request')
      return
    }

    oauth2.getOAuthAccessToken(
      req.query.code, {
        grant_type: 'authorization_code',
        redirect_uri: config.forge.oauth.redirectUri
      },
      function (err, access_token, refresh_token, results) {

        try {

          var forgeSvc = ServiceManager.getService(
            'ForgeSvc')

          var token = {
            scope: config.forge.oauth.scope,
            expires_in: results.expires_in,
            refresh_token: refresh_token,
            access_token: access_token
          }

          forgeSvc.set3LeggedTokenMaster(
            req.session, token)

          if(req.session.socketId) {

            socketSvc.broadcast(
              'callback',
              'success',
              req.session.socketId)
          }

          res.end('success')

        } catch (ex) {

          res.status(500)
          res.end(ex)
        }
      }
    )
  })

  /////////////////////////////////////////////////////////////////////////////
  // logout route
  //
  /////////////////////////////////////////////////////////////////////////////
  router.post('/logout', (req, res) => {

    var forgeSvc = ServiceManager.getService(
      'ForgeSvc')

    forgeSvc.logout(req.session)

    res.json('success')
  })

  ///////////////////////////////////////////////////////////////////////////
  // 3-legged client token: exposes a 'data:read' only token to client App
  //
  ///////////////////////////////////////////////////////////////////////////
  router.get('/token/3legged', async (req, res) => {

    var forgeSvc = ServiceManager.getService(
      'ForgeSvc')

    try {

      var token = await forgeSvc.get3LeggedTokenClient(
        req.session)

      res.json({
        expires_in: forgeSvc.getExpiry(token),
        access_token: token.access_token,
        scope: token.scope
      })

    } catch (error) {

      forgeSvc.logout(req.session)

      res.status(error.statusCode || 404)
      res.json(error)
    }
  })

  return router
}
0
Philippe 16 Maret 2017, 08:29